{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Multi-layer FNN on MNIST\n",
    "\n",
    "This is MLP (784-X^W-10) on MNIST. SGD algorithm (lr=0.1) with 100 epoches.\n",
    "\n",
    " "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import os, sys\n",
    "import numpy as np\n",
    "from matplotlib.pyplot import *\n",
    "import locale\n",
    "locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')\n",
    "\n",
    "import matplotlib.cm as cm\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.font_manager as font_manager\n",
    "import seaborn as sns\n",
    "import itertools\n",
    "\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "\"\"\" Extract final stats from resman's diary file\"\"\"\n",
    "def extract_num(lines0):\n",
    "\n",
    "    valid_loss_str     = lines0[-5]\n",
    "    valid_accuracy_str = lines0[-6]\n",
    "    train_loss_str     = lines0[-8]\n",
    "    train_accuracy_str = lines0[-9]\n",
    "    run_time_str       = lines0[-10]\n",
    "\n",
    "    valid_loss     = float(valid_loss_str.split( )[-1])\n",
    "    valid_accuracy = float(valid_accuracy_str.split( )[-1])\n",
    "    train_loss     = float(train_loss_str.split( )[-1])\n",
    "    train_accuracy = float(train_accuracy_str.split( )[-1])\n",
    "    run_time       = float(run_time_str.split( )[-1])\n",
    "    \n",
    "    return valid_loss, valid_accuracy, train_loss, train_accuracy, run_time\n",
    "\n",
    "\"\"\" Extract number of total parameters for each net config from resman's diary file\"\"\"\n",
    "def parse_num_params(lines0):\n",
    "    line_str = ''.join(lines0)\n",
    "    idx = line_str.find(\"Total params\")\n",
    "    param_str = line_str[idx+14:idx+14+20] # 14 is the length of string \"Total params: \"\n",
    "    param_num = param_str.split(\"\\n\")[0]\n",
    "    return int(locale.atof(param_num))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "\"\"\" Extract total params for each net config from resman's diary file\"\"\"\n",
    "def parse_acc(lines0):\n",
    "    line_str = ''.join(lines0)\n",
    "    # print lines0\n",
    "\n",
    "    idx = line_str.find(\"Total params\")\n",
    "    # print idx\n",
    "    val_acc_str = line_str[idx+14:idx+14+30] # 14 is the length of string \"Total params: \"\n",
    "    param_num = val_acc_str.split(\"\\n\")[0].replace(\",\", \"\")\n",
    "    return int(param_num)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Extract results from diary file\n",
    "\n",
    "    1. Number of params\n",
    "    2. Loss/Accuarcy for training/testing\n",
    "    3. Runing time"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {
    "collapsed": true,
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "def contruct_results_tensors(results_dir):\n",
    "    depth = [1,2,3,4,5]\n",
    "    width = [50,100,200]\n",
    "    dim   = [0,10,50,100,200,300,350,375,400,425,450,475,500,525,550,575,600,625,650,675,700,725,750,775,800,850,900,1000,1250,1500]\n",
    "\n",
    "\n",
    "    ########## 1. filename list of diary ########################\n",
    "    diary_names = []\n",
    "    for subdir, dirs, files in os.walk(results_dir):\n",
    "        for file in files:\n",
    "            if file == 'diary':\n",
    "                fname = os.path.join(subdir, file)\n",
    "                diary_names.append(fname)\n",
    "\n",
    "\n",
    "    ########## 2. Construct stats (width, depth, dim) ##########\n",
    "    # acc_test_all : Tensor (width, depth, dim)\n",
    "    # num_param_all: Tensor (width, depth)\n",
    "    # acc_solved_all:  Tensor (width, depth)\n",
    "    # dim_solved_all:  Tensor (width, depth)\n",
    "    ############################################################\n",
    "    nw, nd, nn= len(width), len(depth), len(dim)\n",
    "\n",
    "    acc_test_all  = np.zeros((len(width), len(depth), len(dim)))\n",
    "    nll_test_all  = np.zeros((len(width), len(depth), len(dim)))\n",
    "    num_param_all = np.zeros((len(width), len(depth)))\n",
    "    run_time_all  = np.zeros((len(width), len(depth), len(dim)))\n",
    "\n",
    "\n",
    "    mode = 1         # {0: test loss, 1: test acc}\n",
    "    error_files = [] #  record the error file\n",
    "\n",
    "    # 2.1 construct acc_test_all and num_param_all\n",
    "    for id_w in range(len(width)):\n",
    "        w = width[id_w]\n",
    "        for id_ll in range(len(depth)):\n",
    "            ll = depth[id_ll]\n",
    "            for id_d in range(len(dim)):\n",
    "                d = dim[id_d]\n",
    "\n",
    "\n",
    "                # 2.1.1 Read the results, \n",
    "                for f in diary_names:\n",
    "                    if '_'+str(d)+'_'+str(ll)+'_'+str(w)+'/' in f:\n",
    "                        # print \"%d is in\" % d + f\n",
    "\n",
    "                        with open(f,'r') as ff:\n",
    "                            lines0 = ff.readlines()\n",
    "\n",
    "                            try:\n",
    "                                R = extract_num(lines0)\n",
    "                                R = np.array(R)\n",
    "                                params = parse_acc(lines0)\n",
    "\n",
    "                            except ValueError:\n",
    "                                error_files.append((w,ll,d))\n",
    "                                R = np.zeros(len(R))\n",
    "                                print \"Error. Can not read config: depth %d, width %d and dim %d.\" % (ll, w, d) \n",
    "                                # break\n",
    "\n",
    "\n",
    "                # 2.1.2 Assign the results\n",
    "                nll = R[0]\n",
    "                r = R[1]\n",
    "                t = R[4]\n",
    "                acc_test_all[id_w,id_ll,id_d]=r\n",
    "                nll_test_all[id_w,id_ll,id_d]=nll\n",
    "                run_time_all[id_w,id_ll,id_d]=t\n",
    "                if d==0:\n",
    "                    num_param_all[id_w,id_ll]=parse_num_params(lines0) \n",
    "\n",
    "    return nll_test_all, acc_test_all, run_time_all, num_param_all"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "depth = [1,2,3,4,5]\n",
    "width = [50,100,200]\n",
    "dim   = [0,10,50,100,200,300,350,375,400,425,450,475,500,525,550,575,600,625,650,675,700,725,750,775,800,850,900,1000,1250,1500]\n",
    "\n",
    "results_dir = '../results/fnn_mnist_l2_sparse'\n",
    "nll_test_sparse, acc_test_sparse, run_time_sparse, num_param_sparse = contruct_results_tensors(results_dir)\n",
    "\n",
    "results_dir = '../results/fnn_mnist_l2_dense'\n",
    "nll_test_dense, acc_test_dense, run_time_dense, num_param_dense = contruct_results_tensors(results_dir)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 2.2 construct acc_solved_all and dim_solved_all           \n",
    "\n",
    "acc_solved_all = np.zeros((len(width), len(depth)))\n",
    "dim_solved_all = np.zeros((len(width), len(depth)))\n",
    "    \n",
    "for id_w in range(len(width)):\n",
    "    w = width[id_w]\n",
    "    for id_ll in range(len(depth)):\n",
    "        ll = depth[id_ll]\n",
    "        for id_d in range(len(dim)):\n",
    "            d = dim[id_d]\n",
    "\n",
    "            r = acc_test_all[id_w,id_ll,id_d]\n",
    "            if d==0:\n",
    "                test_acc_bl = 1.0 # r        \n",
    "                # print \"Acc goal is: \" + str(test_acc_sl) + \" for network with depth \" + str(ll) + \" width \"+ str(w)\n",
    "            else:\n",
    "                test_acc = r\n",
    "                if test_acc>test_acc_bl*0.9:\n",
    "                    acc_solved_all[id_w,id_ll]=test_acc\n",
    "                    dim_solved_all[id_w,id_ll]=d\n",
    "                    # print \"Intrinsic dim is: \" + str(d) + \" for network with depth \" + str(ll) + \" width \"+ str(w)\n",
    "                    # print \"\\n\"\n",
    "                    break\n",
    "\n",
    "########## 3. Construct Tensors for Analysis (width, depth, dim) ##########                    \n",
    "acc_base  = acc_test_all[:,:,0]\n",
    "acc_solve = acc_base*0.9"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Baseline results\n",
      "[[ 0.9758  0.969   0.9646  0.9692  0.1135]\n",
      " [ 0.9799  0.9831  0.9823  0.9811  0.9784]\n",
      " [ 0.9823  0.9829  0.9843  0.9831  0.9831]\n",
      " [ 0.983   0.9852  0.9843  0.9856  0.983 ]]\n",
      "# Parmas\n",
      "<function parse_num_params at 0x7f532db8a2a8>\n",
      "Cross-line results\n",
      "[[ 0.9001  0.901   0.9004  0.9072  0.9119]\n",
      " [ 0.9038  0.9045  0.901   0.903   0.9013]\n",
      " [ 0.9004  0.9003  0.9012  0.9083  0.9032]\n",
      " [ 0.9021  0.9007  0.9005  0.904   0.9001]]\n",
      "Cross-line Dim\n",
      "[[ 650.  575.  650.  675.  675.]\n",
      " [ 675.  625.  625.  625.  625.]\n",
      " [ 650.  625.  650.  650.  625.]\n",
      " [ 775.  650.  650.  725.  675.]]\n",
      "Dim 1250 results\n",
      "[[ 0.9324  0.9329  0.935   0.9292  0.923 ]\n",
      " [ 0.9308  0.9338  0.9309  0.9345  0.9285]\n",
      " [ 0.9243  0.9316  0.9298  0.9311  0.9261]\n",
      " [ 0.928   0.9278  0.9291  0.9261  0.9256]]\n",
      "[[ 114.078  284.308  141.664  156.886  166.606]\n",
      " [ 128.59   134.432  138.162  153.425  167.141]\n",
      " [ 120.698  125.524  147.943  186.251  176.528]\n",
      " [ 120.02   131.825  162.468  229.579  196.215]]\n"
     ]
    }
   ],
   "source": [
    "print \"Baseline results\"\n",
    "print acc_test_all[:,:,0]\n",
    "\n",
    "print \"# Parmas\"\n",
    "print num_param_all\n",
    "\n",
    "print \"Cross-line results\"\n",
    "print acc_solved_all\n",
    "\n",
    "print \"Cross-line Dim\"\n",
    "print dim_solved_all\n",
    "\n",
    "print \"Dim %d results\" % dim[-2]\n",
    "print acc_test_all[:,:,-2]  \n",
    "print run_time_all[:,:,-2]  \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### List the config of depth and width, which yields errors in training"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "E_width, E_depth, E_dim = [],[],[]\n",
    "for item in error_files:\n",
    "    E_width.append(item[0]) \n",
    "    E_depth.append(item[1])\n",
    "    E_dim.append(item[2])\n",
    "\n",
    "str_E_width = \"\".join(str(E_width)).replace(',', '')\n",
    "str_E_depth = \"\".join(str(E_depth)).replace(',', '')\n",
    "str_E_dim   = \"\".join(str(E_dim)).replace(',', '')\n",
    "\n",
    "print \"Error in the following configs: width, depth and dim\"\n",
    "print str_E_width\n",
    "print str_E_depth\n",
    "print str_E_dim\n",
    "\n",
    "print \"Shape of accuracy tensor: \" + str(acc_test_all.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "-------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Check the accuracy of specific depth and width, along different dim"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def check_cfg_results(depth, width, lines0): \n",
    "    for d in dim:\n",
    "        # 1. read the results\n",
    "        for f in diary_names:\n",
    "            if '_'+str(d)+'_'+str(depth)+'_'+str(width)+'/' in f:\n",
    "                # print \"%d is in\" % d + f\n",
    "                diary_names_ordered.append(f)\n",
    "                with open(f,'r') as ff:\n",
    "                    lines0 = ff.readlines()\n",
    "                    try:\n",
    "                        # print lines0\n",
    "                        param_num = parse_num_params(lines0)\n",
    "                        R = extract_num(lines0)\n",
    "                        print R[1]\n",
    "\n",
    "                    except ValueError:\n",
    "                        print \"Error: Can not read\"\n",
    "                        break\n",
    "\n",
    "check_cfg_results(2, 200, lines0)                     "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Reshape the tensor to 1D for plots"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "fig_width = width*len(depth)\n",
    "fig_depth = list(itertools.chain.from_iterable(itertools.repeat(x, len(width)) for x in depth))\n",
    "\n",
    "print fig_width\n",
    "print fig_depth\n",
    "print num_param_all\n",
    "print dim_solved_all\n",
    "fig_params_1d = num_param_all.reshape(len(depth)*len(width),order='F')\n",
    "dim_solved_all_1d = dim_solved_all.reshape(len(depth)*len(width),order='F')\n",
    "acc_solved_all_1d = acc_solved_all.reshape(len(depth)*len(width),order='F')\n",
    "print fig_params_1d\n",
    "print dim_solved_all_1d"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Testing Accuracy wrt. Width, Depth and Dim"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import matplotlib.cm as cm\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.font_manager as font_manager\n",
    "import seaborn as sns\n",
    "\n",
    "plt.figure(figsize=(20,5.0))\n",
    "\n",
    "for i in range(acc_test_all.shape[2]):\n",
    "    acc = acc_test_all[:,:,i].reshape(len(depth)*len(width),order='F')\n",
    "    if i==0:\n",
    "        plt.scatter(fig_params_1d, acc, s=(np.array(fig_width)**1.8)/100, c=fig_depth, edgecolors='k') \n",
    "        plt.scatter(fig_params_1d, 0.9*acc, marker=\"_\", s=300, c='k', edgecolors='r') \n",
    "    else:\n",
    "        plt.scatter(fig_params_1d, acc, s=(np.array(fig_width)**1.8)/100, c=fig_depth, facecolors='None', linewidth=np.array(dim[i])/300.0) \n",
    "\n",
    "        \n",
    "ax = plt.gca()\n",
    "plt.colorbar(label=\"Depth\")\n",
    "\n",
    "ax.set_xscale('log')\n",
    "ax.grid(True)\n",
    "\n",
    "ax.set_ylim(0.8, 1.0)\n",
    "ax.set_xlim(0.3E4, 1.5E6)\n",
    "\n",
    "plt.xlabel('# parameters')\n",
    "plt.ylabel('# accuracy')\n",
    "\n",
    "#make a legend:\n",
    "pws = width\n",
    "for pw in pws:\n",
    "    plt.scatter([], [], s=(pw**1.8)/1000, c=\"k\",label=str(pw))\n",
    "\n",
    "h, l = plt.gca().get_legend_handles_labels()\n",
    "plt.legend(h[0:], l[0:], labelspacing=1.2, title=\"layer width\", borderpad=1, loc='best', bbox_to_anchor=(1.25, 1),\n",
    "             frameon=True, framealpha=0.6, edgecolor=\"k\", facecolor=\"w\")\n",
    "\n",
    " \n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Testing Accuracy of Intrinsic dim for #parameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "fig = plt.figure(figsize=(16,5))\n",
    "\n",
    "font = {'family' : 'normal',\n",
    "        'weight' : 'normal',\n",
    "        'size'   : 16}\n",
    "\n",
    "matplotlib.rc('font', **font)\n",
    "\n",
    "plt.scatter(fig_params_1d, acc_solved_all_1d, s=(np.array(fig_width)**2.0)/100, c=fig_depth, edgecolors='k') \n",
    "\n",
    "ax = plt.gca()\n",
    "plt.colorbar(label=\"Depth\")\n",
    "\n",
    "ax.set_xscale('log')\n",
    "ax.grid(True)\n",
    "\n",
    "ax.set_ylim(0.0, 1.0)\n",
    "ax.set_xlim(0.3E5, 1.5E6)\n",
    "\n",
    "\n",
    "plt.xlabel('# parameters')\n",
    "plt.ylabel('# accuracy')\n",
    "\n",
    "#make a legend:\n",
    "pws = width\n",
    "for pw in pws:\n",
    "    plt.scatter([], [], s=(pw**1.8)/100, c=\"k\",label=str(pw))\n",
    "\n",
    "h, l = plt.gca().get_legend_handles_labels()\n",
    "plt.legend(h[0:], l[0:], labelspacing=1.2, title=\"layer width\", borderpad=1, \n",
    "            frameon=True, framealpha=0.6, edgecolor=\"k\", facecolor=\"w\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Intrinsic dim for #parameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "fig = plt.figure(figsize=(16,5))\n",
    "\n",
    "font = {'family' : 'normal',\n",
    "        'weight' : 'normal',\n",
    "        'size'   : 16}\n",
    "\n",
    "matplotlib.rc('font', **font)\n",
    "\n",
    "plt.scatter(fig_params_1d, dim_solved_all_1d, s=(np.array(fig_width)**2.0)/100, c=fig_depth, edgecolors='k') \n",
    "\n",
    "ax = plt.gca()\n",
    "plt.colorbar(label=\"Depth\")\n",
    "\n",
    "ax.set_xscale('log')\n",
    "\n",
    "ax.grid(True)\n",
    "ax.set_ylim(0, 900)\n",
    "\n",
    "plt.xlabel('# parameters')\n",
    "plt.ylabel('# dimension')\n",
    "ax.set_xlim(0.3E5, 1.5E6)\n",
    "\n",
    "#make a legend:\n",
    "pws = width\n",
    "for pw in pws:\n",
    "    plt.scatter([], [], s=(pw**1.8)/100, c=\"k\",label=str(pw))\n",
    "\n",
    "h, l = plt.gca().get_legend_handles_labels()\n",
    "plt.legend(h[0:], l[0:], labelspacing=1.2, title=\"layer width\", borderpad=1, \n",
    "            frameon=True, framealpha=0.6, edgecolor=\"k\", facecolor=\"w\",loc='best')\n",
    "\n",
    "fig.savefig(\"fnn_dim_global_sparseM.pdf\", bbox_inches='tight')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Performance comparison with Baseline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "fig = plt.figure(figsize=(35,25))\n",
    "fig.subplots_adjust(hspace=0.3)\n",
    "\n",
    "font = {'family' : 'normal',\n",
    "        'weight' : 'normal',\n",
    "        'size'   : 16}\n",
    "matplotlib.rc('font', **font)\n",
    "\n",
    "for i in range(nw):\n",
    "    for j in range(nd):\n",
    "        if j>0:\n",
    "            id = i*nd+j+1\n",
    "            ax = plt.subplot(nw, nd, id)\n",
    "\n",
    "            plt.scatter(dim, acc_test_all[i,j,:], edgecolor=\"k\", facecolor=\"w\", s=60 )\n",
    "            ax.plot(dim, acc_test_all[i,j,0]*np.ones(nn)*0.9,'r-.', label=\"Testing: baseline\")\n",
    "            ax.set_xlabel('Intrinsic Dim')\n",
    "            ax.set_ylabel('Accuracy')\n",
    "            ax.set_title('width %d, depth %d' %(width[i], depth[j]))\n",
    "            plt.grid()\n",
    "            ax.set_ylim([-0.1,1.1])\n",
    "\n",
    "fig.savefig(\"fnn_all_configs_sparseM.pdf\", bbox_inches='tight')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "fig = plt.figure(figsize=(35,18))\n",
    "# fig, ax = subplots(figsize=(5,4))\n",
    "\n",
    "font = {'family' : 'normal',\n",
    "        'weight' : 'normal',\n",
    "        'size'   : 16}\n",
    "matplotlib.rc('font', **font)\n",
    "\n",
    "nn = len(dim)\n",
    "\n",
    "sr = acc_test_all[2,2,0]*0.9\n",
    "\n",
    "ax = plt.subplot(nw, nd, id)\n",
    "\n",
    "plt.scatter(dim[1:], acc_test_all[2,2,1:], edgecolor=\"k\", facecolor=\"w\" )\n",
    "ax.plot(dim, acc_test_all[i,j,0]*np.ones(nn)*sr,'r-.', label=\"Testing: baseline\")\n",
    "ax.set_xlabel('Intrinsic Dim')\n",
    "ax.set_ylabel('Accuracy')\n",
    "# ax.set_title('width %d, depth %d' %(width[i], depth[j]))\n",
    "plt.grid()\n",
    "ax.set_ylim([-0.1,1.1])\n",
    "# fig.set_size_inches(5, 4)\n",
    "        \n",
    "fig.savefig(\"fnn_mnist_sparseM.pdf\", bbox_inches='tight')        \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import matplotlib.cm as cm\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.font_manager as font_manager\n",
    "import seaborn as sns\n",
    "\n",
    "plt.figure(figsize=(20,5.0))\n",
    "\n",
    "for i in range(run_time_all.shape[2]):\n",
    "    acc = run_time_all[:,:,i].reshape(len(depth)*len(width),order='F')\n",
    "    if i==0:\n",
    "        plt.scatter(fig_params_1d, acc, s=(np.array(fig_width)**1.8)/100, c=fig_depth, edgecolors='k') \n",
    "        # plt.scatter(fig_params_1d, 0.9*acc, marker=\"_\", s=300, c='k', edgecolors='r') \n",
    "    else:\n",
    "        plt.scatter(fig_params_1d, acc, s=(np.array(fig_width)**1.8)/100, c=fig_depth, facecolors='None', linewidth=np.array(dim[i])/300.0) \n",
    "\n",
    "        \n",
    "ax = plt.gca()\n",
    "plt.colorbar(label=\"Depth\")\n",
    "\n",
    "ax.set_xscale('log')\n",
    "ax.grid(True)\n",
    "\n",
    "# ax.set_ylim(0.8, 1.0)\n",
    "ax.set_xlim(0.3E4, 1.5E6)\n",
    "\n",
    "plt.xlabel('#Parameters')\n",
    "plt.ylabel('Run time (second)')\n",
    "\n",
    "#make a legend:\n",
    "pws = width\n",
    "for pw in pws:\n",
    "    plt.scatter([], [], s=(pw**1.8)/1000, c=\"k\",label=str(pw))\n",
    "\n",
    "h, l = plt.gca().get_legend_handles_labels()\n",
    "plt.legend(h[0:], l[0:], labelspacing=1.2, title=\"layer width\", borderpad=1, loc='best', bbox_to_anchor=(1.25, 1),\n",
    "             frameon=True, framealpha=0.6, edgecolor=\"k\", facecolor=\"w\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaoAAAEUCAYAAAB6T3LzAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXecVNXd/99nti/sUrbQcRcQEERRERUUwQZii4loLBiN\nNTE+JvGRJJqfxhjTzGPi8yRqFKMJommK0diNLBoFDSAqIL13Ftjed87vj+/cndnZKfdOn93zfr3u\na8q9c+fM7Oz53G8536/SWmMwGAwGQ6riSvYADAaDwWAIhREqg8FgMKQ0RqgMBoPBkNIYoTIYDAZD\nSmOEymAwGAwpjREqg8FgMKQ0RqgMBoPBkNIYoTIYDAZDSmOEymAwGAwpTWayB5BsiouLdVlZWcfj\n+vp6evXqlbwBGSLC/N3SE/N3S19WrFhRqbUuScR79XihKisrY/ny5R2PKyoqmD59evIGZIgI83dL\nT8zfLX1RSm1P1HsZ15/BYDAYUhojVAaDwWBIaYxQGQwGgyGlMUJlMBgMhpTGCJXBYDAYUhojVAaD\nwWBIaXp8errBYIgPjY2N1NbW0tbWFvSYwsJC9uzZk8BRGULhcrnIzc2ld+/eZGamjjykzkgMBkO3\nobW1lerqavr160d2djZKqYDHtbS0MHjw4ASPzhAIrTXt7e00NjZSWVlJcXFxyoiVcf0ZDD2Uurr4\nnbumpoaCggJycnKCipQhtVBKkZmZSUFBAb169aIunj8QhxihMhh6IE1NsG1b/M7f1tZGbm5u/N7A\nEFfy8vJoampK9jA6MEJlMPRA9u2DI0fid/729nZcLjO9pCsZGRm43e5kD6MD80syGHoge/dCTQ3E\ncy4yLr/0JdX+dkaoDIYeRksLHDokIlVbm+zRGAzhMUJlMPQw9u0DreV+dXVyx5JOPPPMMyilOrZe\nvXpRVlbGpZdeyl//+le09aUaYo4RKoOhh+G7bKmqKnnjSFf+9re/sXTpUl577TUeeOABcnJyuPLK\nKzn33HNpbGxM9vC6JamRJG8wGBJCSwtUVnofG6FyzsSJExk1alTH47lz5zJnzhzmzJnDvHnz+L//\n+78kjq57Yiwqg6EHsX+/1+0HEqNKoeSuoCxcCGVl4HLJ7cKFyR5RZ77yla9wySWX8OSTT9LQ0ABA\nQ0MD3/ve9ygvLyc7O5vy8nIefPDBTtl0FRUVKKV4+eWX+da3vkVxcTHFxcVcc801VPldRTzyyCMc\nc8wx5OXl0a9fPyZNmsSiRYs6HfPiiy9y6qmnkp+fT9++fZkzZw47duyI/xcQZ4xQGQw9iL17Oz92\nuyX7L5VZuBBuvhm2bxeR3b5dHqeaWM2ePZvm5maWL19OW1sbM2fOZP78+dxxxx28/vrr3HjjjTzw\nwAPcddddXV57xx13oJTiueee47777uOFF17gjjvu6Ni/cOFC7rzzTq688kpee+01Fi5cyGWXXcbh\nw4c7jnn88cf5yle+wrhx4/j73//O73//e1avXs2ZZ55JbZpnzRjXn8HQQ2hthYMHuz5fXQ19+8b/\n/QNnPJdFdK6GBrjmGtmcEq+ch+HDhwOwd+9enn/+ef7973+zZMkSpk2bBsDZZ58NwP3338/3vvc9\nSktLO147bdq0Dpfheeedx/r165k/f35HAsfSpUs57rjjuPfeezteM3v27I77dXV1fO973+P666/n\nD3/4Q8fzkydPZsyYMTz11FN8+9vfjs8HTwDGojIYegj79wd285k4VWywsv6UUrzxxhscddRRTJky\nhba2to7tvPPOo7W1lWXLlnV67QUXXNDp8YQJE2hubmb//v0AnHzyyaxatYrbb7+dd955p8O9aLF0\n6VJqamq4+uqrO73fsGHDGDt2LO+9914cP3n8MRaVoVvQ2ChXyim2TjGl8Hf7WSRKqAJZMtu2baOs\nrCzk68rKxN3nz1FHxbcMlFN27twJwKBBgzhw4ADbt28nKysr4LGHDh3q9Lh///6dHufk5AB0lDG6\n9tpraWpq4qmnnuLRRx8lKyuL2bNn8/DDD1NWVsaBAwcAOOeccwK+X79+/SL/YCmAESpDt6C1FTZv\nBp9kLIMPbW3gmcu6UFsL7e2QkZHYMdnlwQclJuVrROTny/OpxKuvvkpubi4nnXQSRUVFlJeX89e/\n/jXgseHE2R+lFLfccgu33HILR44c4a233uLOO+/kiiuu4KOPPqKoqAiQtV7jx4/v8vqCggLHnyeV\nMEJlSHva2+Vqfd06KC5OTLwl3ThwIHh2n9aSUJGqF91XXy2399wDO3bA8OEiUtbzqcALL7zAyy+/\nzB133EF+fj6zZs3ihRdeoHfv3owdOzam79WvX78Ogfr9738PwJQpUygoKGDTpk187Wtfi+n7pQJG\nqAxpj1XkWWtYsQLOPBNSpI1OyhCuN2FVVeoKFYgopYowrVq1isrKSlpaWtixYwf//Oc/+dvf/sa5\n557Lz372MwCuvvpqnn76ac4++2zuvPNOjj/+eFpaWti8eTMvv/wyL730Evn5+bbf8+abb6agoIDT\nTjuN0tJSNmzYwIIFCzjvvPMAaUD50EMPcdttt3Hw4EHOP/98+vTpw+7du1myZAnTp0/nqquuisv3\nkQjMv7Mh7Wlu9t5vaIDPP4cTTkjeeFKN9vbgbj8LU0rJPnPmzAEgNzeX0tJSTjzxRP785z9z2WWX\ndRRzzcrK4s033+TnP/85TzzxBFu3bqVXr16MHDmSCy64gOzsbEfvOXXqVJ5++mkWLFhAdXU1gwcP\n5pprruH+++/vOOaWW25h2LBhPPTQQzz33HO0tbUxZMgQzjjjDCZOnBi7LyAJqJ5en2rSpEl6+fLl\nHY8rKiqYPn168gZkcMyePfCf/1Tgck3veO7EE2HIkKQNKaXYuxd8fuIBKSiAWP7s9+zZY6tzr51k\nCkNyCPc3VEqt0FpPSsRYTHq6Ie0J1N/ts886B997MsGy/Xypq5OEC4MhFTFCZUh7AglVWxusWZP4\nsaQabresnwqHlVBhMKQiRqgMaU+wjtn19YkdRypy4IB9S8ks/DWkKkaoDGlPMKFqaUnsOBKJ3c9m\nx+1nYRIqDKmKESpD2hNKqLprrlBVVeC6fb7Ydfv5ntNgSEUSLlRKqalKqbeUUgeUUrVKqZVKqa/7\nHZOrlHpIKbVXKdWolFqqlJoW4FwupdQPlFLblFJNSqlPlVJfSdynMaQCvunpvmjdfRMEmpthy5bQ\nx1RWSsUOu5iECkOqklChUkodB7wDZAE3AV8G/gM8pZT6hs+hT3n23wtcCOwF3lRK+S8GeAD4EfBb\n4HxgGfA3pdRsDD2CtrbQk2t3df81NUn8qa4u+DFO3H4Wxv1nSEUSveD3q0AGcJHW2voXe9sjYNcC\njymljgeuAr6utX4aQCm1BFgD/Bi42PNcKfDfwM+11r/ynGuxUmoU8HPgtQR9JkMSCWZN+e7v1Ssx\nY0kklgBv2QLHHdd1v9sdmVBVVYGnbJzBkDLYsqiUUtlKqa8qpZ5RSq1TStUopVo8rrkKpdT9Sqlx\nNk6VDbQCjX7PV/uM5WLPMX+xdmqt24A/AzOVUjmep2d6zves37meBSYopcrtfDZDehMsPmXRXS0q\nS6B37gz8GQ8dcub2szAWlSEVCSlUSql8pdR9wG5EAE4CPgaeBH4JLEJE51vA50qpJUqpqSFO+Yzn\n9n+VUoOVUn2VUjcBZwO/9uwbD2zVWvsv11yDCNMon+OagU0BjgOwI5yGNKenC5XbHbgFRiTWFJiE\nCkN42tsT/38VzvW3BYkP3Qv8VWt9KNiBHoG6Bokl3am1/r3/MVrr1Uqp6YjAfdPzdCtwq9b6z57H\n/YEjAd7isM9+67ZKd60B5X+coRvTU4XK93Nv3QojR4LLc9mpdeRCVV8vlliQNko9mpdeeomHH36Y\ndevWUVtbS2lpKSeccAK33nors2bNSvbw4kJrq1jZNTVyW10tcdGjj07sOMIJ1S1a63/YOZHW+gPg\nA6XUjwjSX1opdTTwAmL13IpYY5cAjyulmrTWC22OOyqUUjcDNwMMGDCAioqKjn11dXWdHhtSm6Ym\nq31FHW53RZf9mzbBrl2JHlX8qa31pt43NsK//uUVl/b28AIeiiVLoq8+X1hYSIuNq4SWlha2pVL3\nwyA8/fTT/PjHP+byyy/n2muvJT8/n+3bt7N48WIWLVoU81YeyUBr2dxuuT18+DD/+c+GgMcm+k+W\n0KK0Sqm/AScCY7XWrT7PL0RiTqXA88BErfUYv9dejsStjtVar1FK/QK4A8jztaqUUpOBj4ALtdav\nhhuTKUqb3qxcCbt3g9vduSitxdCh3a+SutsNr/r9sgsLpb0JSPX4aCaSY46JvgFldytKO3z4cE46\n6SQWLVrUZZ/b7cblSlwCdXNzc0cH4EhpbZWLmeZm761/9mxV1R4OHAj8Nxw9GsaO7b5FaScAn/qK\nlIePgSJEqNYA5Uop/2Yt44AWvDGpNUAOMDLAcQBrYzVoQ+rSE11/gT5TTY2sm4rG7WeRcnGqFwfC\nc6rr9uLAhA3h8OHDDBwY+P18ReqZZ55BKcV7773Hl770JXr37k1RURG33XYbjY2dc8juu+8+Tjzx\nRAoLCykuLuass85i2bJlnY6pqKhAKcWLL77ITTfdRElJCQMGDABgw4YNXHrppZSWlpKbm8vw4cOZ\nM2cObT6Kc+DAQW666VYGDx5CTk4Oo0aN5Sc/eYItW6TrwKFD4u5N9fVzIQ18pdQfHJxLa61vCHPM\nPmCiUipba+3773YK0ITEl14B7gfmAH/0jCMTuAJ4S2ttJSS/gcS3rvYcb3ENsFprvdXB2A1pSk8U\nqmAp+Vu2SJwqXMp+OFIu868pSHmNYM/HgcmTJ/PHP/6RESNGcMkllzB69OiQx19zzTVcfvnlfPOb\n3+Tjjz/mxz/+MfX19TzzzDMdx+zevZvvfOc7DB06lPr6ep599lmmTZvGihUrmDBhQqfz3X777Zx/\n/vksWLCAJs+P/oILLqBfv3489thjFBcXs3Pnbl599TUOH3ajNRw8WMNFF51Oc3Mj3/jGjxg6tJx/\n//tN7rvvGzQ1NTN37u0x/57iRThP9FmAr2+wL9AHaAMOIVZQJpJeHigBwp/fAn8DXlFKPYrEqC4G\nrgR+7RGvT5RSfwF+o5TKArYC3wDKEVECQGt9QCn1MPADpVQtsBIRs7M85zT0AIxQedm/PzYloxoa\n5Htz2NsvPM+pLk+VAXwY23OG5SrnX9Ljjz/OZZddxrx585g3bx5FRUWce+65XH/99R1ddn2ZPXs2\nv/qVLO8877zzUEpx7733cvfdd3eI3Pz58zuOb29vZ9asWYwfP5758+fzyCOPdDrf5MmTOx2/f38l\nmzZtYuHCfzBlysU0N8OgQXDyyVdxxDMTP/nkI+zZs52XX/6csjLJfpgy5Rxqa6v43e/u58orv0Fm\nmrTCDun601qXaa3LtdblwFygDlm0m6e1HgTkISJTi1gyIdFa/x2Yjbjs5iOJFacDtwF3+Rx6PfA0\n8BPgVWAYMEtrvdLvlPd4jrkDeBOYClyutf5nuLEY0p/WVkkcCEW01kW0xMOlEuozhevka5eUs6qS\nzOjRo/nkk09YsmQJ99xzDxMnTmTRokXMnDmTn/zkJ12Ov/zyyzs9/upXv4rb7ebjjz/ueO6dd95h\nxowZFBUVkZmZSVZWFhs2bGD9+vVdzjd79qUcOiTuuq1b4ciRIoYNG8G9936f+fOfZP36jV0uUt5/\n/w2OO+4Uhg4tp62trWObOnUmVVWH2Lw5faIjTuT0YeBnWuu/Wk9orduBvyilioHfAJPDnURr/Trw\nephjGoHverZQx7UjQtX1l2Lo9tgRofZ22TIy4j+eQFRXx77SQzQZfXapqoKSkhifNIAlYyuZIpTV\nFIF1FCkZGRlMmzaNadOk7OiePXuYNWsW999/P7fddhv9+vXrONaKI/k/3r17NwArV65k9uzZzJw5\nk6eeeopBgwaRkZHBDTfcSH19E5WV8nf2HE5GxiAqK73nU0rxhz+8zW9/+yMefvgHVFUdYujQcm64\n4S6uvFKq0R0+fIDt2zdx7LGB1xocORJ0tVHK4USoJtB1ca3FRuDY6IdjMNjH7oTd0gJ5efEdSzDi\nUZIoEe7MlEuoSEEGDx7MjTfeyB133MHGjRuZPNl7nb5//37Gjx/f6THAkCFDAPj7318gMzOTZ555\nkfb2LJqb5cKrsvIIOTl9OeTREMtjoFRXsR42bAS/+MWf0Fqzbt2nLFz4W+6//5sMGVLGtGnn07dv\nEf37l3L33Y90eS1AefmYgM+nIk6y/vYBlwfZ91UgcZFNgwFnQpUsrAW0sSQR7syUcv3lDnD2fBzY\nGySVct26dQBdMgL/+tcOxxNaw7PP/hmXy8XIkaewYwfs3duAUhns26c4ckTigh988C579uxwPDal\nFMccM5Hvf/9hADZuXA3A6afPYsuWdQwePJwJEyZ12Xr3LnD8XsnCiUX1G+DXSqlBSELEfmAAIl4z\ngW/HfngGQ3DSQaisNSqxrPSQCKFqbJT3iXK5Tmz48r5kj4Bjjz2Wc845h9mzZ1NeXk5NTQ2vvfYa\njz/+OJdffjnDhw8HrMXn8M9/vsY3v3kXp512HitXfszvfnc/l1xyLf37H01jI0ydOotnnvkNP/jB\ndXz5y9ezbdsGHn30AQYMGGJrPOvXf8aDD97B7NlXMHz4KNrb21m06BkyMzM55ZSzALjuuu/w+ut/\n4eqrz+C6675DWdkYGhvr2bJlHStWvM+jj9qq5ZAS2BYqrfUjSqk64D6kpYbFTuAmrbWTVHaDIWrs\nTtjJFCprwu/dO3bnTESMCsSqKi1NzHulOg8++CCvvfYa9957L/v37ycjI4Ojjx7Nj370c2644dvs\n2iV/Z6tR5c9//ixPP/0//PGPj5GVlc2cOTcxb96vOs53xhkzueee/+WZZx7mrbde4Oijj+UXv/gT\njz1mL9xeXDyQQYOG8/TTD7N//y5ycnI5+ugJPPbYPzn22JMAKCjow/PPf8ijj/6YJ5/8BQcO7Kag\noC/l5WM477z0atvnuDKFEmfpUGAQUgdwV4B6e2mDqUyRvqxYIVlQELwyBcD48TBiRMKG1Yk33pA2\nHDaKNDg6Z6zdiYEYM0YqEERCd6pM0d5ORwzJdws067344jPcfff1vPnmRo46KsryHkkmlSpTOE6i\n94jSTs9mMCSNVHf9tbeLoMTSVed2J0akoOclVGjt/Xv5bon6vg3BcSRUSqlCZB3UcCDXb7fWWj8Q\nq4EZDOFIdaGyKubEUqgS+VlSKqEixrjdga0kK8ZkSC1sC5WnjccrSHWKQGikNbzBkBDSRahi+f6J\nXMDc1CRbrv8laZrhayVZyS3xspK+/OXr+PKXr4vPyXswTrP+tgE3AZ/71eozGBJKa6v9q99kC1Us\nxSXRlTaqqiBILdaUw1hJ3RcnQnUMUp5oRbwGYzDYxUnmW7LKKHUHoaquTk2hChRL6o51HQ2CE6Ha\ngdToMxiSjhOhStYEZo0xluKSqNR0i2gSKrTWASsqODtHYCspXI1HQ3SkWiK3E6G6H/i+UupfWuua\neA3IYLCDkwm7tVUmvCjnTMekezIFRC5UGRkZtLa2ku2gBHtbW2cxamry/u0MiUXrFlpbU6eyupOR\nXIhUotiqlFqK9I7yRWutvxazkRkMIXAiVFbacczbVoTBEqpYFsZNtOuvpUU+h9NaiYWFhRw+fJj+\n/fuTlZXVxbJyu+W8bW2wc6exklIBsaLctLc3UV9fS21tn2QPqQMnQnU6ktlXA4wPsN9c9xgShtMJ\nOy79lcLg29C1uRny/XtWR0Ay4m3V1c6FKs/zgiNHjtDuUaCWFm8mYUuLXEBofRilEvyHMQREa3C7\nM2hpyaK+vgi3O4Z1v6LESQml8ngOxNC9iLerzWmsJtEuM/9eWbESqkTHqCDyzD+XK4/W1jwOHoSD\nBwOLrNu9AZfrxOgHaejWpI4T0tCtqKuDgjgWZ051ofK1piB2llAyLCq7cSq3Gw4fFlE6cABqTCTb\nECOcVqbIB74OnAn0R+JUi4GnPc0ODQZAJqxUEqpET/DxEKpElk/yJZRQ1dXRYTFVVpo4kyE+OKlM\nMRCoAEYD25H+VCOArwC3K6Wma61NTyoDIHGNtjbIjJPNHkmMKpHEQ6iSlWbf2ir9kvLz5X5lpVhM\nBw92/ZwGQzxwMo38EugHnKG1/sB6Uik1BXgB+AVwXUxHZ0hbmppkEouHVdXS4rzaQKIneX+LLxbv\nn6yFywBr18pnqqoy6eKGxOOkw+/5wA98RQpAa/0h8EPgglgOzJDeNDbKVXg8iCShIBKh2LMHgjR2\nDUs8LKpkCtXevXDkiBEpQ3JwIlS9gT1B9u3y7DcYABGTVBIqp5P8tm3S7yrSCuLdTagMhmTiRKjW\nA3OD7LsGWBf9cAzdAbdbLJh4CVUkE7YTi2r9evj8c7lfW+v8vSA+QpWM1HSDIRVwEqP6FfAnpdQA\n4Dmku+9A4KvAOQQXMUMPw5pQU8misiNUWsPq1WJNWUQiVFp3HWM6J1MYDMnGyYLfZz3p6T8G5vvs\n2g/cqrV+LtaDMySP1lbIinBhumVNxCsjLB5C5XbDypVdY1L19c7LHwVK9rDakric+DD8MK4/Q0/F\nUfKw1voJpdR8YAzedVTrtdam40s3Yu9eEYPyCGuRpKJFFa7e3t69wRMn6uqgj4OyZ8EEuqUluiaE\nRqgMPRXH13daa7fW+gut9QeeWyNS3Qi3W1KRKysjP4c1Ube2xmeBaqSxmlBWVaikCafuv2BCFa3Q\nmBiVoadiW6iUUr9WSi0Ism+BUuqh2A3LkCy2bhVL6NChyFORfSfUeLj/eqpQGYvK0FNxYlFdDLwV\nZN+bwJeiH44hmbS0wIYNcr+1NfLUbF8hibX7z2qkFwmhXhdLoQompNEITbLKJxkMqYAToRqCdPkN\nxC7PfkMas369lD2yOHgwsvP4WhSxFiqrPUSkrw1EQ0NoEUiURRVqv8n4M/RknAjVEWBUkH2jgLro\nh2NIFnV1sH175+cijVPF06KKxioJNtmHsxwbGpwVW41UqPbtkyzDSF5rMHRnnAjVO8APPeuoOvA8\nvht4O5YDMySWtWu7WiqHDzuvqefvmou1UEVzvkiFCpxZVZEKVW2tiFUkrzUYujNOhOr/IWWSNiql\nnlNK/VIptRDYAPRC6v0Z0pCDB2F/gLr3Vn8hJzQ3dxa8WCdTRFopAoJP9nb6Ldl931AxtHDuOyNU\nBkNgbAuV1nobcDLwEjAD+LbndhEwWWu9NR4DNMQXrcWaCoZT95+/MMXaooqmGV8iLKqmpuAxtHBi\nU1MjFwaBjjOp6YaejNMFv9uAa+MzFEMy2Lkz9OTvVKj8J9S2NhGI7GznYwtErIWqsdFeooJdoQpl\nQYYSquZm7zj274fhwzvvN8kUhp6M4wW/SimXUupYpdSZSqle8RiUITG0tcG6MKWEq6qcpUUHmqhj\n5f5rbw+ebGCHQJO93RT8WAhVqIxF3/MHcv8Z15+hJ+NIqJRStyGdfT8D3kVKKaGUekkp9V8OzjNb\nKfWeUqpOKVWjlFqulDrLZ38/pdR8pVSlUqpeKfWOUmpCgPPkKqUeUkrtVUo1KqWWKqWmOflMPZnN\nm8NPgFrL4l+7BHJRxcr9V1cXXT+kaISqsbFz6n6o44KhdXDR9xWqgwe7vpcRKkNPxkllipuAR5AY\n1eWA8tn9PtKS3s55bgH+AawALgXmAH8D8j37FfAKMAu43XPeLGCxUmqo3+meAm4C7gUuRCq6v6mU\nmmj3c/VUmppEqOzgxP0XT6GKxu0HgS0aJ4ua7VhV4WJJwQTH97O53V3XsJkYlaEn4yRG9V3gf7TW\n31NK+Zf2XAfcFe4ESqky4DfAXVrr3/jsetPn/sXAVOAsrfViz+uWAluBecB/eZ47HrgK+LrW+mnP\nc0uANUiF94sdfLYexxdf2F8b5ESoAlkUqSJUIBaNb7zMqVD16xf6mHBuzuZmKCgIfG5f9u2DQYM6\nv85g6Kk4cf2V01lQfKkH+to4x9cBN/B4iGMuBvZYIgWgta5GrKxL/I5rBf7ic1wb8GdgplIqx8Z4\neiRVVbBrl/3ja2vtX9GnskUFnSf8piZnloodi8qOUNk59/793jVspnySoafjRKgqgbIg+8YAu22c\n43TE+vqqUmqzUqpNKbXJE/uyGA+sDvDaNcBwpVRvn+O2aq39p8E1QDbBq2j0eEKlowfDTpwqUMNA\nSC2h8o1TOa1lGC+hChT/am31rmEzGX+Gno4T198/gXuVUhWAVWxHK6WKge8gsatwDPZsDyHVLDYj\nMarfKqUytdaPIH2utgV4rbX0tB9Srqk/UtYp2HH9gw1CKXUzcDPAgAEDqKio6NhXV1fX6XEotAal\nwh+XSrS1RZY599lnsHFj6GO0DpxwUFsLNr/SkOcObf3U4XaHf5OVK70NIZubnVXeOHgw/OcIZ6Ft\n2AA7/CpmtrUFHsfy5dK/qr3deYWQ9MHe382QWvh2wU4EToTqh8gC39XAR4AG/hcYCxxA4kLhcAEF\nwHVa6xc9z73riV39QCn1vw7GEzFa6yeAJwAmTZqkp0+f3rGvoqIC38fBOHJEJvyh/ukdKYzbLRNt\nJF1ms7Ig3NdSXQ3vvRd432mnQU4UztiDB2HZsuD73e4KXK7pYc8zejQcdZTc/89/gleCCMbUqcE7\nH9fXw7vvhn79wIEw0S/VZ9MmiRn6k5kp3/mBA/DRR87GmS7Y/bsZUouyssS+n5PKFJXAJOBnSBbe\nZkTofguc5okjhcNyIPnXBXwLGAAMQqykQCFry0I64nMb6jiHxX+cUVkZeRuMZLFtW+TrkBobw782\nlDURrfsvFm4/iM71B6Hdf3bWiwVy/QU7Z2OjjNEkUhh6Oo6urbXWtVrrB7TWp2utR2utT9Na36+1\ntjuNrAmz3+05ZnyAfeOAHVprq0r7GqBcKZUf4LgWYJPNMUXEwYP2asSlCq2t3l5TkRIu+y/URB3t\not9YCZU16be0RDamuhA9AuycL1C8KdRn27fPpKYbDE7WUbmUUpl+z81USt2plDrB5mkWeW5n+j0/\nC9iltd7lvXxXAAAgAElEQVQHvAwMUUqd6fM+hcBFnn0WryCW3Ryf4zKBK4C3tNZxuw5tbxfXX3V1\ndAtQE8mGDdFnjoXrT5VOFlWk1nAoi8qOoPhbR1qHFr99+0wyhcHgJEb1PNCMp9afUupW4FHPvlal\n1AVa63fCnOM1YDHwe08SxhZEaM4Drvcc8zKwFHhWKXUX4uL7AbLA+JfWibTWnyil/gL8RimVhayz\n+gaSRn+1g8/lmEOHvMHturrA62JSifp6aTEfLVZ7+mAJJPESKrc79GTuBGvSj9QajrXrr74+dKJE\nTQ1k+K9aNBh6GE5cf6ciQmNxFzAf6AO8CNwT7gRaa420rP8zcD+SSXgKcLXW+hnPMW6kysTbiBAu\nAtqBGVrrnX6nvB54GvgJ8CowDJiltV7p4HM5xteySAf3X6BeU5HQ0hLasgk1UUcjVHV1sct6i9ai\nCvb5tbaXvu6/JsrOa44Eym01pCxaw5o1sGgRfPqpsYhjgROLqhTPWiml1CjEcvmt1rpWKfU08Jyd\nk3jiWbd5tmDHHEYWB389zLkakYoZ37Xz3rHCN1ZTXQ3DhiXy3Z1x6JDzzLZQVFZCnz6B98XLooqm\nB5U/lkUTqVA1N4vQ+Gb+ud3wySf2e3e1tHhfHyuXpiH57NkjWbWLF3fu75adDcccI9meEydCeXlk\nmbc9GSdCVQMUee5PByq11p95HrcDuTEcV8rS3Nx5cklli8q6sosllZUwcmTgfeGSKSJddxbLybyl\nRYQmWuHs78ktbWuT9U7h4ne+NDdDr17ecxnSl9pa+Pe/RZx8OxEUFYkobdkibvdPP5Xtj3+UUMFx\nx8Hxx8sxAwcmb/zpghOh+hD4vlKqDWma6OsGHAU4KMqTvvhnvlkJFam48HfXrtin0FvxOf8rwtbW\n0LUD3W6ZoHMjuJyJpVC53c6qwQfCEqqWFlnf5PRixTdOZYQq/WhthRUrxHr6+GPvIvfcXFkveNZZ\ncOyx3thiVZUsmP/0U1i1Si5qPvhANhChOv542Y47DgoLk/KxUhonQjUPEaeXkSSIH/nsuwJJgOj2\n+F85u90y2aTaj6u9PXyvqUjPW1XltSgs7GS8NTQkX6jAmfUTiNpa+SzLlkW2Ls0SKrc7uv5ahsSh\ntSzMfvddWdRuXWAoJVbRjBkiUoF+3337wrRpsmkNe/eKYH36qQjYvn2yvfmmnG/kSK9wHXNMdAvl\nuwu2hUprvRE4WilVpLX2vya9A+lT1e0JNMlVV6eeUG3eHL/1NwcPRiZUkaxbammJ/eeIVqgOHpTJ\nJtJxWUIVbX8tQ/w5eFDceosXw26faqbDh4vldOaZ4uazi1IweLBss2fLhd+WLSJcq1ZJhZJNm2R7\n4QWJZY4bJ2J4/PES3+qJWaCOWtEDBBAptNafx2Y4qU1dXeDJqaoqtRIqmprkhx4vKithzJjOz9kR\noUjiQvFwjUVrxUSbKm8JlUmkSE0aGuDDD0WcPveZ2fr0kZJW06fDiBGxcfdnZMDRR8s2Z478Ntau\n9VpcW7Z441sg8a0JE7yJGT0lvhVSqJRS3wUe1VrbvnZUSp0IlGqt34h2cKlGsCvxVEuoWLfOfq+p\nSDhyRPzymT6/HruuP6d0x8ncEioTn0od2ttFHCoqYOlSb0p5djaccoq49k44If7WTE6OvM8JnhIK\n1dWd41sHDoiIfvih7B8wwJuU0Z3jW+EsqrnAXUqpPwLPa60/DXSQUqofsvZpLtLK47pYDjJVCCZU\nNTWBEwySQU0N7PRfbRZjtJZU7NJS73Pxsqi6o1BZk2B3/GzpxtatYjktWdJ5vdr48SJOU6d6MzST\nQZ8+cMYZslnxLcvC+uwzSYN/6y3ZlBJLz4pvjRvXfeJb4YTqRER87gTmKaVqgM+Bg0iVin7ACGCk\n5/FfgHFa623xGnCyCJUtZlVOSIWrmVinowfj4MHOQmUsKvsYiyq5HD4swrR4ced2FYMHizideWZq\nutR841vnn985vvXpp+Iy3LxZthdf9Ma3LOEaMSJ941shhcpTSeJPwJ+UUqcgNflOQcQpF6mG/j7w\nIPAPrXWKOcFiR1VV4F5LvvuTLVT79ztrGx8N/u9jN5nCSSq/3WoP6UZzs/yWoi3Ua7BPc7Nkab77\nrkzqVqWT3r0lG2/6dIm7puIyk2AEi29ZbkL/+Fbv3uIetBIzBg5Mn8/rJOvvI6QPVY8kXKZYVZVk\nAiULtztx1hSIpdPSIj58sDfpWs0P8/LsvUdDQ3xjbcmirS314prdEbcbVq8Wy+nDD72/0cxMmDxZ\nrKdJk4L3F0s3/ONbNTXiHrQyCv3jW6Wl3qSMVI9vOc7666mEs1SS3Ztq+/bEr8mprBQ3RHu7/crs\ndXX2hao7uv0sEmX59kR27RJxqqjofIE5erSklJ9+empPyrGisFA+6+mny2MrvrVqlQjYgQPe+BZ4\n41sTJ6ZefMsIlQ3a2sIXBk1mQkUsek1FgiVUTtYTVVVBSYm9Y41QxZfmZrGI08X9E4qaGlmIu3gx\nbNzofb60VNx6M2bAkCFJG15KMGiQbLNmeeNblmtw7Vp5vGWLFNPNypLFxpZwJTu+ZYTKBpWV4Rdm\nWhUqghVsjScbNyanQrN1tepEqJxUAu/OQhWN66+1FR59VCaS885z/vrGRnjkEXEB9erlDdAPGiST\nuXW/d+/Ix5gIWlvhP/8RcVq+3OsmzssTK2LGDLEMUiEbN9XwjW9ddplctHzxRef1W599JtuCBd74\nlpWYcfTRiR2vESob2L36rapKvFDFqtdUJDQ0yOYkKcDJBN2d4zjRVKT45BP417/EtTVmDBx1lP3X\nVlbCAw94fzP19XKh42uFWBQWekVs6FAYO1YmqGS6hLSWdYKLF0sxWGvxtcsFJ50k4nTKKanltkoH\ncnK88SrwxrcsV+H+/Z3jW4MHJ3Z8RqhsYLfkTjLiVF98EbteTZFQWenMmmtuFmELF6eqrzct2IOx\napXctrfD44/DT39qz323ebOI1OHDYjHdey/k50vsYs8eKRFk3d+7VyarmprONSMzMqQW3bhxsh1z\nTGIuzvbtE2F+993ObWvKyyXuNG0a9OsX/3H0FPzjW/v2da5PuGdPYsdjhCoMTU32S+Yk2gLYu1e2\nZFJZ6c38s8uRI+GFym5vp56IlW6cmSmZnhUVYkmE4qOP4Fe/kguFcePg7ru9CQX9+slzvliLui0B\n275dLoq2bZN46IYN8NJLcuyQISJYlnANHhybuFddnVQYX7xYYigW/fvLWqcZM6CsLPr3MYRn4ECJ\nbVnxrfZ2cRkmCkdCpZTqBdwATEN6U92std6olPoqsEprHYd63cnFSQHT2trEJVQ0N8uVTbKprHR+\nJVtVFd51YIQqMIcOSeWRvDy44Qb47W/hD3+Ak08OHFPSGl5+WY7RWib3b30rfEq2UlJstahIastZ\nNDTA+vUiWmvXyv3du2V75x05pk8fESxLvEaMsJ8C3tYmrs3Fi0VcrWzSnBypTj5jhsRK0nXhancg\nI0P+tonEtlAppYYBFcBQYB1wLFDg2T0DOAe4McbjSzpOhMrtFldJ377xG49FqrS4bm523t/JTkJF\nND2jmprg1Vcl7XbmTPjylyM/V6phuf3Gj4dzzxVX2Nq18OyzcOutnY9tb4ff/x7e8FTdvOYaWRga\njbWTn995rU5bm8S71q71ildVlSyuXbZMjsnOlliaJV5jx0oSxIIFUFl5JsXFkhRiZe5ZLnSlRJSs\nFhr5+ZGP25DeOLGo/gcpkzQaaUnvO00uAe6L4bhSBqdpxNXV8ReqnTs7t7pONnbXUFmEazbZ3Gx/\nTVhFhXfCKyqSCXzVKu9k9/LLcOml3SMFG7xuv4kT5TPdeit8+9siRuecA6NGyf76evjlL8U6ycqS\nY844I/bjycz0Zo9dcom3Ht0XX3iFa9cuqULuW4lcKSuhRHHwICxc6N03bJi3lJHdpQyG7o0ToToX\ncfVtV0r5G967gW63SqGmpnM3VjtUVTnLwnJKQ4Ostk9n2ttDN5u0a01VVMDvfmf9jRSVlVLDDWRx\n55493jhLd1hDo3VnoQKJ0Vx0EfzjHzBvnny3liv28GFxw91zj1gxicC3Ht3ZZ8tz1dVe4friC0nO\nCJT1mJcHDz4oyRrd5cLCEBucRFOygWCV1/oAISrhpSeRLMqMZ0KF1mIthKo5mC6Ecv/ZjU8tWBD4\nQqJPH3joIVnvAZ2v5J3Q2hp92/pYsnOnfG/9+nXuf2bdb2vzJkEcPixJBw89lDiRCkafPnDqqXD9\n9WLlBROhpiaxCI1IGfxxIlSfAV8Jsu98YEX0w0ktIukEW1sbv/p0W7em1sQZDaEE3e5nDHYhUVMj\nk52VBBCpUP3mN3DjjbL4MRX45BO5Pf74zpP5X/4S+HiXKzWrgBcXO3veYHAiVA8BNyilnkSy/gDG\nKaXuRzIBH4r14JJJqLYeodA6PhUVamvFbdJdCGZRtbba//7CTXjHHSe3n3/ufIFtZaWkRre3SwZa\nKuDv9rMIJtipelEzd27XBbk5OfK8wRAI20KltX4R+CYwB/AkovIn4NvAt7pbR98jRyK3jGK98Nft\nlqvpZC7sjTW1tYFdmE5KLFkxEF98J7whQ8RNVlXlvJnkv/7l/b6XLo2skkRNjcSNXngh/LEVFZJu\nfsklcltR0Xl/W5s3Nmm5NC3SzUKZPh1uu00SJZTSlJTI4+nTkz0yQ6riaB2V1vpxpdQC4DSgFOlH\n9aHWutt1DYrE7WcR6zjVxo3Jr87ulIMHRSQyQ/zCqqq6TqZOrID16+U2Px8aGzXFxYq5c70TnuX+\ne+89sarstmFxu+Htt+V+RoZUmd60yXl9s1dflcSBXbvgS18Kvvanc1KIfHe/+53ctz7Lhg0Swxk2\nTNY2+TJ3bufXQ+pbKNOny+Z2L8Hlmp7cwRhSHsdLU7XW9Vrrd7TWz2mt3+yOIgXRLTiNpahUVQWu\nw5bKbNoEN90kMZ5QBBJ0u9/7unViZeblwRNPwKJFS3jqqa5X5ZHEqawWCKWl3qKvVo0zu7S2wuuv\ny/26utB/w0BJIc3N8ryFtX7K3+0H/hYKxkIxdDucVqbIRKypYUiH305orf8Qo3ElnWh6O1kJFdGu\nnm9vl8k4mgKmyWD5crFK3nsPvvIVqccWCH83n9tt3xp9/nm5vfBCSXMP5ha1hGr1avtVQyxr6pxz\nZF3W66+LUF17rf2MtPff7/xZPvkkePZdsBiT7/OWUPm7/SwsC8Vg6I7YtqiUUicCm5HqFM8C8/22\nJ+MwvqTQ1hZdQdRYJVSsW2e/zmAq4VvENFhGGnQVpSNH7MXhvvjCa01dcknoYwcNEvdiTQ3s2BH+\n3DU1EpNSSmJg48ZJevXevVLnzg5W2SKQtGzwZuwFIlyMqaFBXH8uFxx7rL0xGAzdCSeuv8eBOuBL\nwBig3G8bEfPRJYlYiEO0carKytRJi3aC2+2NHWVkiCUSbIJvaup8QWDX7WdZUxddFL5Tq1Leyd2O\n+6+iQi5UTjhBXGgZGdI2AkTA7GA1oevTR+rqZWSI0AT7XQUq8aQUXHWVd9xutyxiNmWEDD0RJ0I1\nDrhLa/2K1nqj1nq7/xavQSaaWAhVNHGq1lavqyfd2LVL3KbFxVJpGeCvfw1+vK/7z04ixdq18t3Y\nsaYs7MaptPa6/XwbEk6dKrcffGDv/V55RW5nzRIhHTdOhCbY39SqPm91283IkLHs2iXPB0tLNxh6\nCk6EagPQK14DSSWSbVGtWeOsGWEqYbn9xoyR+FRmpkzwwdxu1vektb3UdF9rqqAg9LEW/nGqYGzY\nIO0s+vSRauS+r+/dW1LcLfEIxoEDUow1MxPOP1+eswq4BnP/ffyx3N5wg5RC+tnPxM23aJG4OY1Q\nGXo6ToTqbuCHSimbSb7pSyyEqq4usnVY+/Y5X/MTa3bvlurWkSRxWEI1diwdVbG1Dh6rssSppiZ8\naajNm2XSzs+3b02BVGcoLZW/SahuyJY1ddZZndtSZGZ63X/hsv9efVXEcOpUKWEEXqFaubLrd9rc\n7BWwyZPlduxYKaTrdksJJKutx+jR4T+rwdAdcbLg9w3gdWCjUupzpdR7ftuS+A0zsUST8WehtXP3\nX3Oz9+o5WezYAXfeKZ1g33vP+estobL61VhW1b//HdgasSqp23H7rfAU6Zo2zb41ZRHO/dfYKJl6\nIO0z/JkyRW5Duf8aG6W1CMDFF3ufLy+XivpWLylfPvtM2rWMGtV5fdRVV0lxYyvzb/z40GvSDIbu\njJOsv+8D84AqoAZo99u6Td2EWGXaOXX/WZNWsqipEYFqaJDHTz3l7LuorRUxys72pqSXlEiadzCr\nqq1NXmcnkcJqFBksRTsUoYSqokJq+jU2ihhs2tT1mIkTxarZurVzK3RfFi+Wi5yxYzsvDna5OltV\nvnz0kdxa1pRFVhZ85ztecTJuP0NPxonr79vA74HBWuupWusZ/lskA1BKvaGU0kqpn/g9308pNV8p\nVamUqldKvaOUmhDg9blKqYeUUnuVUo1KqaVKqWn+x9nF7Y5dqSInFtXOncEnwETQ2go//an0uRo1\nSibbqir405/sn8PK9hs1qrPr7LLLZMJ9/31xK/pTVRXeompp8dY6nNDlVxAe6zVr1nR2yVpVIWo9\ny9bb2uSxfwmjrCyvmPi7/6zyR48/Lo+tnlC+BBIqt9sbn7Jci76MGAHf+IYkY0yL+BdtMKQ/ToQq\nH/ib1jpmtcGVUlcCXa6PlVIKeAWYBdyOVG3PAhYrpYb6Hf4UcBNwL3AhsBd4UykV0TWoXZF69VXp\nnhoqDmXXompsTG6PKa3h0Uclo66oCH74Q29a9RtvdF4XFQrf+JQvpaUS93G7A2cA7toV3pJct07E\ntLw8fEp6IEpKJFbV0NA57d9OVQiL006TW1+hsoTOt+TW2293FboTTpCMvjVrvO+3caP8RkpKpK9U\nIM49F37+88R0jTYYUhUnQvU6UpUiJiil+gG/Br4bYPfFwFRgrtb6eU987GJkvPN8znE8cBXwHa31\nk1rrfwGXAzuAH0cyLjtCVVcnbrFXX/W6boIdFy5BIBV6TL34ohRhzckRkerfX+riXXqp7P/d7+yN\nz7J4AlVgmDNHhG/Jkq51FO3Epyy3n1URPRKs11rnOngweE3HQNUiTjpJvqMNG+R1TU3w5JP2hK5P\nH2kI2NrqvSixrKnJk00PJoMhFE6E6jfAtUqpe5RSJymlRvhvDt/7F8BqrfXzAfZdDOzRWnc0WNBa\nVyNW1iV+x7UCf/E5rg34MzBTKeXXTCA8djL1PvzQO3Fba2aCEa5CxbZtkTVojBXLlnnde9/5jkym\nFldcAQMGSMr2P/4R+jzt7d56dmPGdN0/YICkfLvdkSWMxEKofONUFRXwX/8V/NhA1SJyckSsQDrR\nzp3rdRn6E+hv6u/+C+X2MxgMXpwI1QfA0cADwMfAxgCbLZRSpwPXArcFOWQ8EMgZtgYYrpTq7XPc\nVq11Q4DjsoEA0YLQ2LGorOwwEFdOqAoSodx/dXXibksWW7bA//yPWHVz53oz2yxycuDWW+X+889L\n/CoY27aJhTFwoLcVuj/jx8vtmjXOxtnQICLocnnPEQmWUK1cCQ8/LIkPI0Z4F9xahKo8bn1HW7aI\n5RQsEy+Q0J14otx+8onEI7dvl1T7aD6TwdATcJLw+nUg6vKoSqlsJCnjV1rr9UEO6w9sC/C8lRvW\nDynn1B8ItEzUOq6/0/GFE6ojR+SKPDMTzjhDMr3++c/gV+fBhCrZPaYOH4af/EQm2xkzJOEhECed\nJJ/z/fclJvf//l9gN1Ww+JQv48bJrVNx/uILsdiiLSHUv7/0qNq9WzL4brxRMhKXLBFXXWWlCIxv\nqxB/pkyRlPu8PElwWLfOfouNMWPkdbt2yW8G5Pv1TTwxGAxdsS1UWutnYvSe84A84MEYnc8xSqmb\ngZsBBgwYQIVP5NvtrkPq7gbm/feH4HYfzUknVTJnzmYWLz6FJUvcXHvtUgoLW7scv3t3YPdfc3N0\nhW+jobnZxYMPTqSyspBjjqnmm99chdY66ALf66/PZsWKySxfnskHH6xmypSufq11644BBjBmzAbc\n7j0Bz1NWpsjNncrevZkcOvQh/frZy8X/9NMRwHAmTNiO2x1sxW4dbndF2HNde20Ry5aVcMUV2xg4\nsAmtRXD8s+qCXUC4XJ1FqLQUtC7l2WdHUFmZQ3FxM9dcs4Vp0w50OYfLBccdN56PPirh1VfdgItJ\nk9bidh8IO+7ui72/myG1sFugOVYkdAmhp6rFPcCNQI5fDClHKdUXqEWspEAOJMtCOuJze1SI4wKu\nztFaPwE8ATBp0iQ93efy+ZVXKoDpgV4GyMJVgGnTihk6tJhJk2D5chdvvz2VOXMCv+b00zu7iKqr\nxUKx03Ii1mgNv/2tuNJKS+Huu/uQk3NmyNcUF0uLi8cfh/nzj+XEE7taNpZFNW7caFyuwCUUXC6x\nuFatgnXrpnTU0AuHtfbp+OOPwuUK9OcGt7vCVgO+006zsvcG2ntzG8yYIZuQi5TFHBfw2JNOkgSc\n9nYXLhecfPI4XK7Ax/YE7P7dDKlFsCzVeBFyqlRK/UEpVe5zP9T2lI33G4H8Jz+LiIy1Afy35/4E\nJMYUyHM/DtihtbaWoa4BypVS/g6hcUALEGDpZuTs3y8Tcna2d03NhRfK7euvB8+M811P1d4euJRO\nonj+eRHJvDy4917JRrPDrFniejt8GJ59tvO+I0fku8nLC99F16n7r7ZW4kGZmd5qF+mMlVABEpvq\n3Tv4sQaDQQh3TT8DsFatnOV5HGoLx6oQr3vWc38T8DIwRCnVcamvlCoELvLss3gFWV81x+e4TOAK\n4C2ttV/icHRY1tQpp8ikDFIxYMgQiW8sWxb4db5xqmT2mHrvPfjzn8WymTfPfmt2kNfcdpvcvvpq\n5461ljU1enT4ZpGWUNlNqFi9WkR97FiJ/aQ7AwbI7wVMtp/BYJeQQqW1Ltdaf+q5X+Z5HGwLm56u\nta7SWlf4b57d2z2P6xAxWgo8q5T6qlJqpuc5BfzS53yfIKnpv1FK3aiUOhtJTS8H7nP8bYTBqn13\nxhne51wur1VlBcj9sSyqQ4eS12Nq/Xp45BG5//Wve9OsnVBeLjXstJYEAiuV304ihcWYMWIdbdvm\nLdUUCsvtF01aeqpx9dVikc+wc2lnSEtcLm9RYkP02Hb9JRKttRupMvE28CiwCKknOENr7V9b/Hrg\naeAnwKvAMGCW1tqvqlp07Nwpdd569eo6yc+YITGbtWulwrc/VVXiFgzV5TWeHDwo635aW8WFd9FF\nkZ/ryiulksKWLV5hdiJUOTmyVsvttlfxIhbrp1KN00+XhdVOC+sa0oMhQ2ROmDpVXL3hvAyG8IRz\n/V0HlMR7EFprpbX+od9zh7XWX9da99da52utz7asO7/jGrXW39VaD9Ra52qtT/Gx0mKGtXbq1FO7\nphPn50uaMwS2qurrJYEgGT2mGhslDb2qSoq53nxzdFUQ8vLgllvk/nPPSYt2q4hroIW+gbAbpzpy\nRKq55+R0LvJqMKQiRUXibfFNNho6FM48034s2BCYJOSdpR9ae91+wYqDzp4tArBkSeC1U3v3xm98\nwXC7ZWHr1q1ylfe978WmVcTkySLYjY3wzW+KpZaRAcuX23u93TiV5fYbN86sNTKkLr17y//ElCmB\nazL26iVWtG/VF4MzjFDZYMsW2LNHroqCuaAGD4ZJk8TFZ/UkSjZ/+pOkQvfuLQt1Y5lhZlV5sOJU\n7e2Bq44Hwsre27BBRC4Y3dHtZ+g+5OTIb3P6dEmSCYXLJRdcp57aPZKCEo2d6+uLlFLH2jmZ1voP\nUY4nJbGsqalTQ/ubL7xQOuO+9hp8+cvJbXT3r39JsdmMDPj+90VIY8lLL3V9zirGGqyqg0VhoWQc\n7tghbsNgaedGqAypSEaGtHIZMcL5/3hJibgCP/kkeEFkQ1fsfM332DyXBrqdULnd3vhUuJ5AEyfC\nsGGSeLF0aefswESyerVYNyC1+uIx0QcrpGu3wO64cSJUa9cGFqoDB6QeXq9eMiEYDMlGKbnAGjMm\nOqsoJ0eWJmzdKuXBklVGLZ2w4/q7FEn3Drd1y+lk3TqZfEtKwme1KQUXXCD3w1VVjxd798LPfiYu\nyEsugZkz4/M+gYquhnren3AFaq341PjxJmvKkHwGDhRPwXHHxcZ1p5RcgJ1+ulyMGUJjR6j2aq23\n29niPtokYLn9Tj/dXsmjGTPkh7duXedFsYmgvl4y/GprJV523XXxe6+5c7v+w4aqOu6PlVAR7IrS\naoVh3H6GZNK3ryRJnHxyfKqI9Okjnpphw2J/7u6ESaYIQXs7fPCB3LfbCjwvL3Sqerxob4df/lLc\njkcdBf/93/G1RKZPl0oVJSVydVhSIo/DxacsSkpkq68XF6Avy5Z5ayFGsjDZYIiW/Hxv54Ciovi+\nV2amhA1OPDG5ce1UxnwtIfj0U6kqMWSIszjJBRfAyy/LZHvddcH7M8WS+fMlQNunjywmjaYdhl2m\nT7cvTIEYN07S+deu9Ra53LkTfv1ruf+1r3nLDRkMiSArS0qBlZUlvmj0kCEyV6xcKWsIDV7s1PpL\nYmu/5GIlUZxxhrNFsgMHiqugrQ3efDM+Y/Pltdek/l5mJvzgB+FTZVMF/zhVfT389KeyPuuMM+BL\nX0re2Aw9C5dLMvnOPlsuSpPR2QDkAnPKFLPA3Z9wtf6W+FQq71G0tEjmHth3+/lilSl6443Qa4Wi\n5ZNP4Ikn5P7tt3tjP+mAb4UKt1ssqd27xXV5++3RVdAwGOwydCicdZZkn6bCwnKrHc5pp0FubrJH\nkxoY118QVqyQoqkjRsgP2SnHHedNVf/wQ1k7EUtaWqSu4C9/KZP8nDnpV+R06FBJwDh0yGs9ZWfD\n3Xebf1BD/CkuloulVC1vVFws88aqVdJGpydjhCoIdtdOBUMpsaoefVRS1SMRqqYmWUu0d2/XrbLS\n24GJrDYAACAASURBVNNqyhSpyJ1uvPdeV2tTa6n0PmhQcsZkCEzfvoFLg6UjhYViPZWWJnsk4bF6\n323d6vU89ESMUAWgsRE+/ljuR7Nod/p0SXLYsEHaY5SUSPq2bwJCQ4NXfPbs8d7ft0+aFAbD5ZJY\n1PjxUiQ2WT71aFiwoOs/XmurveoWhsQyaZIE+D/9NHiD0FQnN1dcakOHpp9bubxcsg9XrEheP7tk\nYoQqAB99JK61Y44RcYmUZcu8tfBASqY88oh0A9ZaBMm3+68/mZkiRoMGdd1KS9M/lTXa6haGxJCT\nI8su8vLETbZiRejfbaqRmekteZTOi8cLC8XDs3p11yUd3R3HU51SaiAwHGkp3wmt9XuxGFSysdZO\nRVsCacGCzkIF8viLL7yPs7O94jNwYGcxKi5O73+scBQXB653Zre6hSEx+C6vsCqBf/FF8pqA2kUp\nSTMfPVr+z7oDGRnSrqe0VKzbeCZqpRK2hUopNQRYAASKtiik1l/aT6stLS5WrZL7p50W3blCWQY/\n/amIUb9+6em2iwVz50pNwuZm73NOqlsYEoN/6wqXS1zORUUS6E/FyXLQIPGIdNfyRIMGyd9l5crQ\nIYLughOL6jFgAjAP+BxoDn14erJ6dR+am70+4WgIZjGUlMCxturRdz8yMrxWphWHWrBARL24uGsM\nz5B8gi1YHzhQkoRWrEidBar9+0smXyIW2SebvDxJpNqwQcq1WclV3REnQnUG8F9a6wXxGkwqsHy5\nqNOkSdGfy1gMncnIkOrTW7d6n4u2uoUh/gRqBmhhTZbr13s7PSeDXr3Egupp2aJKSTX34mKxrpqa\nkj2i+ODE6dQIHIjXQFIBrWMrVNHWw+tuFBWlT9UMg1BQED5px+USkTjllMTHgrKzpYnn9Ok9T6R8\nKSqS72DgwGSPJD44saieBOYCCSgKlHgWLoR582DfvjyUkoy8YA39nGAsBi/FxeKacbl67nqQdMOJ\nC620VFyBK1fKIu54kpEhWXyjRqV/9musyMqS0m3bt0tmYHf6H3PyJ94NzFVK/Qt4HegSwkvXDr8L\nF8LNN8uaJhDL6rHHZEI1IhM7rCzG/v1NCnq6EMrtF4jcXElC2rhR3IHxwGpeaKqXBOaoo+R/bMUK\nafnTHXAiVI97bsuQYrX+pG2H33vu8YqUhd226gZ7ZGXJOhAQwTJClR5EkpSglKSE9+8v1lVzjNKu\nSkvFy2H9jgzBKSiQ5TVr18K2bckeTfQ4EaryuI0iyQRbPGcm09hRXOytBlBSIo0lDeGxmlPGarJ3\nQkaGTHiRYtWq++STwNmvdunTRzL5zPo6Z2RkSPyupCR1lxHYxbZQddcOviCuhO0BPp35x4gdvt9l\nnz5iYaXzP068cLnEErEaSxYWSjZdMoS9b9/oSw3l5EiSxebN8hmcpFDn5UnJoyFD0q/kUSoxcKB4\nhhIRO4wXJgwJPPhg5xgV9Ow08njgW4pKKRGuvXuTN55Uw8qcO+qortVIBgxIjlDFai2SUpL0YLkC\nGxtDH5+VJf2Yyst77mL4WGPFDjdtkthhuq25clKZYisShwqK1tpBH9zUwao8fs89sGOHprhYmYWn\nMSQ3t2uFgJKS9BCqkhJZm1JXF79/bqvtebDEhcJC+Q4TvUbGaSJFOPr3l1p1wdpWuFxS8ujoo7tP\nyaNUQin5bouK7F0wpBJOLKoldBWqImAKUAe8G6tBJYOrr5btlVeWANOTPZxuRSAXajq4VZWS9XSZ\nmVIxvKZGWl1YW3199O8xaJDUbgvXsK+kRHqbJZJ4VHew2lZs2SL1Aq0U6iFDxM2Xnx/79zR0pn9/\niR1+9pl0bEgHnMSorgv0vFKqL/AG8E6MxmToZgQSpV69ZFLyz7ZMJQoLvWt0MjPlH7x/f+/+1lap\nIm4J18GD9ltgWPXyysrsHT9gQGKFKjc3vunfI0bId/nhh1LZItbWmyE0WVlixZeUyJor/+LZqUbU\nHmCtdRXwEHBv9MMxdEeCWU/Jsqrsthv3FaVg5ykulvjLpEnS0dkuJ51kX6Sgc9ZkIkhErby+feVi\nxYhU8hg+XNyxqZ7yH6tQZRMQQcP2noHL1XODwr16SfZWIKLp9RUpVusHOzgtSmz3eJfLeXfZrKzE\nFlrtCUVdDULv3rLmakQKZxhENX0qpTKVUhOBHwFrYjKibkJ2tlxhT5oEM2fKFXRPJJTVlAyLqrDQ\nfk24cBZVpMf37RvZhUsiW6cbK6dnYbmiJ09OzUQWJ1l/boJn/dUAF8RkRGlM796yZmHAALki9XXV\nDBwoP4Q1PUzOQ1lN2dmypiqR3WL79ROxys6WLs7B6NXLu9jWLjk58rpwSRaRto9JVJq6UkaoeioD\nBkiixapV0S3SjjVOsv5+TFehagK2A69rrdOoOXVsUEquoi1xCtekbcQISXMOtLi4uxJuUi4pSbxQ\nWeu4QmU8ObWmLIqK4idUiUpTLyjo3p2lDaHJzY18kXa8cJL196M4jiPtyM6WdVZOr7qPPVYy3VLp\naiVeWJZLKEpKEtvHyIq9lJTER6j69w9ekgu8FzeRkog0dROfMliLtK0+V7FYihENMQnxK6VylFJ3\nxOJc6cLIkc5FCsQXfNJJ4ibs7tiJQVltP+wSTWvxrCzv68MlckRq9YR7Xd++0VkriejnZYTKYNG3\nr2QFDhmS3HHYniKUUsVKdU6QVUrlKaXuBLYCD9s4x2VKqReUUtuVUo1KqfVKqZ8ppQr8juunlJqv\nlKpUStUrpd5RSk0IcL5cpdRDSqm9nvMtVUpNs/uZIiUry1lqcaDXJ6PJXLwI1g/ITlafy+VMFI47\nzv6x/vhOwHl5wUXPijVFQn5+6PVHkQqgRSLS1E18yuBLZiaceCKccELyen+FFCqPpfSIUqoW2A8c\nUkp9w7PvGmALsoZqJzDLxvv9N9AO3O05/jHgG8DbSimX57wKeMWz/3bgK0AWsFgp5Z8C/xRwE7KG\n60JgL/CmJxMxbowcGf0fLD9fmpylc9p6795SP2zmTMkWGjLEay04cXHZTVMvKZGJOhJLFrpaCsGy\n6KJxzYV7fbTnjneaemZmz7D2Dc4ZOlSsqz59Ev/e4abbexGxeAdYibT6eEQpNQ64DdgA3Ky1fsXm\n+12ktfaNzixRSh0G/ojULXoXuBiYCpyltV4MoJRailht84D/8jx3PHAV8HWt9dOe55YgafI/9pwn\n5kRrTfnSvz9MnCg+4HQiI0Ma1/kWDR0wQLb2dqnjVlNjX8wHD5ZCmeFWx48cKbcFBZG1veiY4N3t\n4MqguBi2bu16XLRiUlQUOP4VbXzKorQUDndpWxobYlEx3dB96dULTj9dksISSbjr+SuAR7XW52mt\nv6+1vgK4FRGpt4HjHIgUfiJl8R/PreUFvRjYY4mU53XViJV1ic/rLgZagb/4HNcG/BmYqZSK8Lo7\nNOXl9isb2GHIEJn004XBg+Gss0Q0AlmDGRlyzNix9s+ZlyfFMkNRWOi1vCLtkdS3L9DWAEfkyiCY\nGy1a91wwMSosDPPbabNXTyqecSoTnzKEw+VKfCWLcEI1DFjk99yLntuHtdYhVqLY5kzP7Ree2/HA\n6gDHrQGGK6V6+xy3VWvt/9+9BsgGRsVgbJ3IzIzP6u3Ro8WsTmV694ZTT5VEkHjUgBs5MnRcyLKm\nIDKhKijwiETdVmjcB00HyczsOjFnZkb/T9jxXn6EFcDqNdAUPh3USlOPB0aoDKlIOKHKAmr9nrMe\nR51grZQagrjp3tFaL/c83R84EuBwy9nRz+ZxMXCydCbW1pQvxx8fG7dQrMnIkD5JZ54Z35JHLpek\n7gciN1esNIsuQqXdKEL7Dfv1A9ytUO9ZxFa9GrS7y2fyX6gdCcFcfCGFqrVOBLTWXq5+vP4WJpHC\nkIrYiSIMUUr52hEZPs9X+R6otd5i9409ltE/gDbgeruviwVKqZuBmwEGDBhARUVFxz63uw6oCPAa\n6Z+0b1/8xmUtrLNaHySbrCxxy+3aJVsiyMjo2vnX7Yb33vM+1rrzd+SiBa0b0e6KoOfdvx8qDjVD\nu3XyGsh4h3ad3elc1dXg83OImObmrn/HL74IUVmivdHzggOQ+S9QoXPYW1tj/ztxuWDp0tieMxx1\ndXWd/v/SEy1bx8pYn/tKAS7PrQn+RYodofp7kOdfCvCcrRUiSqk8JOY0AjhTa+07DR7BazX50t9n\nv3V7VIjjgoabtdZPAE8ATJo0SU/36ZD4yisVBOpHNXIkjBsX7Iyxo64O/v3v5LZp791brJtkFI1t\naIDFi72TcGYmnH1218SMt9/2VGjQ7RS3v8sRBbkMot4VOOB36iluChvegXYfJ4LLjS6dwpvvZHd8\n35MmRR+jAjhyRP6OFgUFIRpxtjXC/ndBe8aWVwhFJ4c8v9awYkVsm08OHpz4mpQVFRVMD/rFxAHt\nBncbaM/m9rsN+Fx78P1OcGVCRi5k5Pnc5nV+zhUnl02aE06oYm7pKKWyEPGbBJyrtf7c75A1wHkB\nXjoO2KG1rvM57lKlVL5fnGoc0ALErN6By9U5RhJPeveWyXLZssSXLsnIkHjZiBHJS5vPz5fEivXr\n5XFZWeDswYICEap8vZUMpKZQL/cmGtVw3KpzufbMTCjI2AXtfqmC7lZU3XqKiiawb598Zluur/Zm\nyAidq9Onj3yfViZjSPGr2yITqEXjPnEFZgXPE1dK1rYsXx64W24kpGR8SusgQtLuQGh8X5NEd4W7\nDdx18rcNhsqAzAAC5nvbA8UspFBprf8YyzfzrJVaCJwFXKi1XhbgsJeB65VSZ2qtl3heVwhcBDzn\nc9wrwP3AHCS9HaVUJpKp+JbWOoIE5sCUlUW+dicSiotlYeunnybuPQcNkqK5wVpyOKatATIja9c6\ncqSUCWpqkrhgIAoKoPJAK73c3usRhZsC91qqMzqbBX37aFT95sAnqt9Oaf8y9u0r6BCXkLhbofJD\nyBsKhcFTFV0umfgrK+VxUKFqb/HGzXyp2wT9QiwHdLfiaj7MpLGNfNbUSM3hBjJ0I+Cm2TWIJjWY\nduVs1XJChaq9BZoPisvz8Ao/cWnvfL8nodtFyMKJmSVamXngyu182w3FLNHrjH+HCMuDQL1S6lSf\nfbs8LsCXgaXAs0qpuxAX3w8QB+8vrYO11p8opf4C/MZjpW1FFg+XA1fHasCJtKZ8GT5c6mvFuw5e\nr14wYUKM3Xwt1VC5FArHQO8gShOCjAxxPe7dGzy7raBALCgXnX2kuXoPDbqMVuVVhuKCA8H/8bWm\nNHsNcGr4ZBat4cgqz0SyToQ4P3htmf79bQhV/bbAk3HDLigYIxOPP+3N8v221uICJpTB+mbv2pYs\ndzW9WUcrfWhyDaFJDe5iZfrjcsV5IafW0FoNTQdka/F48N1uaEiTfuipgm6HtnrZgl2O+4pZMFHL\nSJ/SOIkWqvM9t/d4Nl/uB36ktXYrpS4EfgU8CuQiwjVDa+1fjvN6RPR+AvQFPgVmaa1jtoR2+PD4\ntuQOxdixIlaxjENYZGSIiy3YeqiIaa2DymVieVSvgczekOtcBa1WKcEoyG8iP0juTmH7ag5lTOtI\n3yvKDmJNechTB+mbs5+iojALlGo3ilvO4sgqEavswAO1hC9oyxB3u6TLL70WWqu67s8ugssqOz/X\n3uQRKa/wZrhkLd66dZ2Lh2ZRTZa7mgLW0ko/mlyDPaLV9QddWBgHd69lNTXtl7R7dyxWsxhs4Stm\nwVCu0PGyjLyUEbOECpXWuszmcYeBr3u2UMc1At/1bDEl211JW0Y/Ro1KXr8DpaS+VmMjVAWYxyIl\n5m4+i7ZGmUStCUlrceuUnB4y3hKMULUQC9iAInC8IZMa8vROGtVwMnUVBTmHvDtb66BpLxR0dtsN\n6f0Z/fJPAIJU0m06ADXrOz+n3VD5MZSeEdDNaaW6B7WmGnbIdxVIpABaDslkb00W7U1w8MOAk0+H\nWH0BDf+/vXOPkqMqE/jv68c8MslkMpnJC/IOIRBBXKMLqCEqGhVQF/G1wsq6chTPors+Dssucnwd\n9xw9sizu2bMqurqii4uyGHwtahgILyUiCSEQQoBE8iDJhMkk8+jumb77x1c9XVNT1d0z09PdM/P9\nzqlTr1u3bt1bVd+93/3ud/tGRpXkJZLZl5jFE6RlLv2yiJQsJOuNiy+LWbpz+ixDraYyvrRG+XHZ\nUQozn0CrL4PF0SiokovB2qc5u435czM0phZDchkkxuG2exzE4+oTcMuW8c9D1NSkKrUJmSk2p44a\nDCQym4FO72deLr35QA+J1D5e0f9XJN3In2GaFh5tvI1+WUhb/R6Sube87wBsvx5SR2HRxbDyb4bM\nwBe091N3/CHILILZa/Wj9N2PYxGN9GwaOn+nwjjwfImEqtNCBZXLwsnCLT0Aep5TFWquElDgp5KI\nw6rT4IkdMFjAZqDOdVLnOoHHGWAWaZnL3BltMDh39DXowTSkPMFkraapR5Qwa15d0WSYoArDDRKn\nl1MWohZZJ59V9VXTMmiYXxlnaC6rH302TQNpzj07xR8eSZMdTBNzKWKkiZFGXJas1JGljiz1I7Yd\ndUi8jlWrE+VX8+XIZlTdF/UTHeiBzq3Q9udaQxsv3TqbW5iQAqijixhpmrPbmdPo6U179sHjn833\njRz4maqkzvg0xBuZkWtd9h6Avhfz/WsuC52P6DNGkTmpLce5rx7xfK2tEYKq74AKn2KcfA4aF6mw\nj3Kx5FMdNgA5U5I0LTzW+F8Fo09wgoQ7QSvPq0vnZDPUt3lL68jKhbWajCpggiqEBCdGeunuP6JL\nolEF1owlo6t95gTPYGpIAJFNaY006zs2dH74j3EW8PJlsHt3WNwR26hKZ+kSqG+IweF6iNV5i287\nHrIt8cD4kcC2/1j/Ich0B9Lkhgv01FHo2gFzvHk6BtMw2OvV1noh2+89fzqfFy7rUzl4ageJl9z5\n3uAOMLMJOLEHHr8BBk7A7LNg8aXw1I1w7BF44C8hzKtFsgXW36H3zASds4TQfwQO/dbLx6QukmDp\n7CSNKQf9nmm0G9Ql7U1r3F/EtjybgcP3FTarjlAd1lGaEInHoSH3rme6dTn5rJZfcrYKrUSTlmE5\nWk0+wboB8j5uki1wXmHBOiaGTNzT+W9raO3bdpki53PXB+PywrjAdW4AJJl/H4beDd9aCpyLJb3z\ndSHng2H9cU696ZlNUAWIx+FlK7tZGGVAMdAHx5/U/orkLG+wk/N+JIXW4x8UNadFjTsKzSCbo74e\nli6Flpwll8t6NfgSavHjIdUJL9wJh34Ns8+EFR+CGZ4jw569kD6m6sFCLRQ/2fRIIQhFzZbFpXBS\nTzNPwvbPq1BsXQdnXKvC+JyvwI4vaH9VGJmucDPh7l3w4j1Q1wLz1sNj/xAuKLyf7kyAKEvjvkOw\nPWhTFKBnLzQFxrUP9Kr5et8hNVYowMLM/5CWNtLS7q3bcDK8lRQ5rYdz2mIqd6spqk8u06V5Oxrh\nMSQgCoRzVRw9XxViEcLPLxxLFHyhYev0e6og4io9qrTGWLdundu6devQfkdHBxtOfRae/Q7MWgUt\nZ8PMFWOrpURZc42z5rh3X/QgTxH1MLBwIcQmUkMZ9WwjEhSHRRfB0vepBWApcRTLn75DsOsm6N4Z\nGSQl7RxJbOSUwR8j2X5oOx/WfGq4KivTDQ9dHn2f9Zt07bKqenvhzoL3jLw+9BkOwLZ/UoOJXOs1\njHgjrPqotrq7n4YTT0PvnxjRdB4FGWaTlnZSngBraJlHy7x2VW/Xt2srajTq7Vw/Rua4Lunj+e2o\nY5VGEtE/5chWTe581M8813KOui7uteTChGy6BIHsb52lQ66NuCbCyKjsWfoB/uCcW1eJe1mLKoyn\nvqY/pKMP6H68CVrWqtBqOVvVfqX0tRSqOWZO+lRcUS9p+Iu7JJumWTJkUvpSOhI46qhrSNDckiQx\nkIT9uY/Ip3qQhG/br5LI7Sfy2xILSYNvKSSk2s6HRW+Dw1vg0N2wfxMc7oCll8PCN+WFfqH8OfQb\nbXlJXJdYUtfpl2DvD3WgaAHq3RFOzdyqO/NeD6d/fGRlI1nETfr+n2k+7N+kggX0XVj4Zm1ldD5c\nOB27/0PVw5Lwlpj3PDHYf5e2LpvPhJfdMNJqcDClwvjoA7DrX4afk4T2n81YrIJl34+IonfupfR1\nHaXOHaXOHaHOdarZujtOk/MG6XV6S45YncZb3w4N81T1l2yGgZMBgdOlwj59nLL9HNsvKFLTD6vl\n13nvblAF5n+/J/EMpaPFDUYLsVA1ZRHB50IErMTR0UCVwVpUgRbVls2/4HUvXqIV1gVvhK7HtQ/G\nT3I2tJylAmuon6lff6yDKe9YP5wImDNPF/wtiZN7YM8tOqYKdMyRJPRlL6VFFkXb+RpnSO08TQsv\nJK9gidxJYt4rYfmV0T+q+0qcX7N+Hpz6dph/YV6oDKbggXePLf2glZ611w+3MPTjsrDvduh8yPOE\nsRpmrdYWfszXP1roGdZvYs8e6Mx5vnSDJOmizh2hPqvC65S2w8QzXh9s6nBhc+Uo4jP0u6ibrevc\nEtxPzobfXVkwvcYkoHk1MnuNtaiqRXNap39g1mpYfY0e7D+sAqtrO3Rt05rwkfsLR1SMRFOEvjii\nUzVEv5xxdfT0CM0zB9RDQzajHb1DNaCc2iDi3LBwgXO4QJoCaTseNmVYCDNXwtlfVrdDz/6n/ghL\nYd7rVe01ZLjh89XWdh6064Dep3frGLOjkqXN5YVRPA5Lz3kTRSeyKZiGC9SQYv4bof38kS2yIv7+\nWPURrbDkDCiGlqyqNxe9rXAcEoOl79WlEMmWaBUqsGw5nOzxZkWWOBnmkpG59MS0L3NJ0NJ4oFf7\nvlJH9N1PHdF8SM6KFkJTzGWPUVuYoArQknpMN2avzR9smKetqwVv1A7mvgMqsFKdnpVcfd4yLbcd\nq4dt10bf6Pz/Hndak6g7jqpQaksEtL+j/TVqvt1/WNU0kixcs17z9yVFPaMxfDB0e7sOgi1KoZ/8\nmk+VlIZIFl00vutLpUh/ZzwGq1bBzp0jbXpCDSkSMyCxdKQRR7koIlgNI4gJqgAtaU/vOjtiFj8R\n9e9WwMebEUEsWfZ8i/KuUfKg5vGaQ0/0TzfeoC2ZEmb+LUTTDFi8eKTFaKFZlScMX553PJllwxnT\nqP9osiOxfF93BTFB5Wegl1mZp4GYmlaPl8lcc5QYIL61bxvRvqbc4Fk/o3m2UvPHb+QRS+h9vaZB\nY4iD9uZmaJjVAi0vg+yg5znhxcIeqcdK7qdb36oDcxEg6xu24B/D4+ukHvTGjUVRP1cNJhrma76n\njsHxneF5XiIL5kN3N7zUFWeQRrJST1NrDBoC5UygrCWmzzLYr2rBwb7ShxcY1UXingYj4a3jvu3c\nEgwTODbs2upUKkxQAdyxYGjg5VAxPPh+7UC/ZJf3U/EMJIYMJvq1ryHMgi537OIn8xZJEvd+Xtnh\na5cdeWzY2jceKzSM814en0VZbiFiO2d9Vuh8MS4LmZfSZfN5M5hCf3Lx4S+/CEMDmy/akbckkvjw\nvrB4fT5fg6bSA71qpNGzj4aG4dZmWZK0rjgD2pfkr2to04rHQK+qHjNdDP8Je+tYcqT6lqyqentf\nyA/S9dO4QIcxRDimLchgyhtge9xbn9B4Zi7XVpSf+laY91od7Nz9ZLSXiiHfbAGv2d7+8vZG9m1J\n0tcHsZin3RvLvyc74H0LfbrkBNhgX/54Ned+moyIFBESiXCBMuJ4fPj3NgUwQQXR3gFSh3Vgp1Ea\nEvOmpSji7TbeoB1sYyUxQ60uZ51G7MQe6hv2QipLnyxmoOkM2pfVEzrrd2IGzFw2+vvNXKFL5iT0\n7VfBVTcHZq4ak7PdIeL1EG8fnXf5GYtUOPbsVYEwwvt1YW8pSXTCxQcfVD+EY3apFUtAbGb08zvn\nVUj6fMKsTweK5rbH6+FiaHp38f2QQ/b94YLXjSaeyHij9nOVx0LCJidUEhCbeh4lyoUJKmPyEm+A\nlrVk5p7GwMEtdMfOYc2yCaxEJmdC8nT1A1hNJDameb5ytLbqFDKpsk0tGoKIJ4jriTT5yQ7CM/fC\ngvPGICCM6YQJKmPSM7O5DncwTjymLqaM4qxcOXzuqqoQ89TPYZNDGoYPM7cxJj2zvO6chQsjJig0\nRiBSwMefYdQYJqiMSU+z5wlp2bKqJsMwjAnCBBWoCfBojhs1RVOTeqLITf1uGMbUwvqoAC7N+/Lr\n6Ohgw4YN1UuLMWpiseiBv4ZhTH6sRWVMCeJm2WsYUxYTVIZhGEZNY4LKMAzDqGlMUBmGYRg1jQkq\nwzAMo6YxQWUYhmHUNCaoDMMwjJrGBJVhGIZR05igMgzDMGoaE1SGYRhGTSPOm9J7uiIiR4C9vkNt\nwNEqJccYO1ZukxMrt8nL6c65WcWDjZ9p7+vPOTdselUR2eqcW1et9Bhjw8ptcmLlNnkRka2Vupep\n/gzDMIyaxgSVYRiGUdOYoBrJN6udAGNMWLlNTqzcJi8VK7tpb0xhGIZh1DbWojIMwzBqGhNUgIgs\nFpEfi8hxEekWkTtEZEm10zUdEZENIuJClq5AuDkicouIHBWRHhH5jYicFRJfg4h8VUQOikifiDwk\nIusr90RTExE5VUS+7uVnr1dGy0LClZT/IhITketE5HkR6ReRbSLyroh7XyUiT4lISkR2ichHy/+E\nU5NRlFvYN+hE5JxAuIqU27QXVCIyA9gMrAE+CFwBnAbcIyJN1UzbNOfjwHm+5cLcCRER4C7gLcA1\nwLuAJFpmpwbi+TZwFXADcDFwEPi/4AdnjJpVwHuAl4AtBcKVmv9fBD4H/BvwVuBh4HYReZs/kIhc\nBXwD+Ala/rcD/y4iV4/zeaYLpZYbwHcZ/g2eBzwdCFOZcnPOTesF+AQwCKzyHVsODACfrHb6ptsC\nbAAccGGBMO/wwrzed2w2cAy42Xfs5V64v/YdSwC7gE3VftbJvAAx3/aHvXxeFghTUv4D84AUEVmR\nqQAAB7xJREFU8PnA9b8FtgeuPQx8LxDuO+ig4WS186XWl1LKzTvngC8Viati5TbtW1TA24GHnXPP\n5A44554DHkB/iEbt8XbggHPuntwB59xxtJX1jkC4DPAjX7gB4DZgo4jUVya5Uw/nXLaEYKXm/0ag\nDrg1cP2twFkistzbPw9oDwn3fWAu8NrRPMN0pMRyK5WKlZsJKlgL7Ag5/gRwZoXTYuT5gYgMikin\niPww0GdYqMyWiMhMX7jnnHO9IeHqUDWIMXGUmv9r0Zr5MyHhIP8drvXWwbIPhjPKw9Vef1KviGwW\nkdcFzles3Ka9CyWgFdXXBjkGzKlwWgw4DnwNuBfoBl4B/CPwkIi8wjl3GC2z50OuPeat5wAnKVy2\neOeNiaPU/G8FupynDyoSjpA4rTzLz63Az4ADwFLgM8BmEXmTc67DC1OxcjNBZdQUzrk/An/0HbpX\nRO4Dfo8aWFxflYQZxjTCOXeFb3eLiPwUbRF9iSqoWE31p1I+rOUUVRs0Koxz7lHU2uhV3qFCZZY7\nX0q4YyHnjPJRav6/BLR41pzFwhESp5XnBOOcOwH8nPw3CBUsNxNUqiddG3L8TGBnhdNiFCanYihU\nZvuccyd94ZZ7QxCC4dKM1K0b5aXU/H8CqAdWhoSD/HeY69MIln0wnDFx+NV8FSs3E1SwCThXRFbk\nDngD4F7jnTOqjIisA05H1X+g5XKKiFzgC9MMXMLwMrsLHV/1bl+4BPBe4G7nXGqCkz7dKTX/f4Va\nB34gcP3lwA7PChfgIdScOSzcMdRS15gAvO/rYvLfIFSw3KyPCr4F/C3wUxG5Hq0xfBH4EzpAzagg\nIvID4DngUaALNaa4DtgP3OwF24S+/LeKyGdQ1cJ1gABfycXlnPujiPwIuElEkl68V6Pj5IIfjTFK\nROQyb/OV3vqtohORHnHO3Vtq/jvnDovIjcB1InICLfv3Am9ATdxz4TIi8ll0oOh+4DdemA8B1zjn\n0hP5vFOFYuUmIp9GK4b3kDem+DSwgGqVW7UHoNXCAixBR0x3AyeAOwkZBGdLRcriOmA7av2XQSsM\n3wQWBsK1ogMGjwG96CDDl4fE1wjcCBwC+oHfARuq/ZxTYUErdWFLx2jzH4ijhjJ7UZPn7cBlEff9\nCNpnmQJ2Ax+rdl5MpqVYuaGaiQfQVlAG6EQrh6+uVrmZ93TDMAyjprE+KsMwDKOmMUFlGIZh1DQm\nqAzDMIyaxgSVYRiGUdOYoDIMwzBqGhNUhmEYRk1jgsqYcojIld602aOexkNE3ikinxzlNZ8TkQkZ\n51HOuANTimdE5IiIbBGRz4rIvJDwHSLSUY57G8Z4MEFlGMN5JzAqQQXcgk4ONxGUO+7vevFdgHoG\nuA+4BnhCRM4PhP2YtxhGVTEXSoYxRkSk3jmXcs69ALwwEfeYgLj3O+ce9u3fJSI3A1uAO0RkhfMm\nOnTOmZNXoyawFpUxLfDUWPeLyIUi8qg3a+kOEfkLX5jvAh9EHd7mVGTPe+c2ePuXisi3PN9oL3rn\nRqjnvLBfEpGPi8hzInJCRO4VkbWBcBtF5EEROS4iJ0Vkl4jc4DsfFndCRK4VkZ0i0u+p8H4lImvG\nkjfOuRfRifHmA+8P5FmHbz+XB+8UkW+IyDER6RKRm0QkLiKv8vK4R0SeEJGNY0mPYQSxFpUxnVgJ\n/Cvwz6gfs08Bt4vIGufcM6gz4nZ0zp2cU82gh/WvA78ErgAaitzvcmAX8Al06vWvos6P1zjnBjyP\n/ZuAHwNfQKe+OA1YERFfjttQFeVNqIPPBmA9sBB4qsi1UdwNDKCzBny7SNibgDtQB6TrUV9vceBC\n9Bn3e8fuEJGlzrmjY0yTYQAmqIzpRRuw3jm3G0BEHgUOAu8Bvuyc2+O1lNIB9Zif3zvnPlzi/TLA\nxc65jHc/gNuBVwMPAn+GCrCrnXPd3jWbC0UoIm8A3gV8wjl3s+/UnSWmKRTnXJ+IHEWFXTE2O+dy\n/Xi/FpGL0BkIXuecu99L50FgG3AR8L3xpM0wTPVnTCd254QU6DQFwGHUe36p/O8owv46J6Q8HvfW\nufs9hgqz20TksjDLuxDejHq6/tYo0lEqwvCJ8aL4ZWD/KaAnJ6R8xwAWlyNhxvTGBJUxnQib8jpF\ncRWen4PjuF9OjdgA4KkbN6Lf4feBQyLysH9CyBDmAsecc32jSEdRRKQRbXGW8nwvBfbT6NxhQ7j8\nHEOjyVvDCMUElWGMjrKOl3LO3eOcewvQgvbxDAA/F5G2iEuOAq2eYCknG9F+pvuLBTSMSmOCyjCG\nk0In+6sonpn7ZnSG4iZ0Ftww7kZVdKX2kxXFUzl+BW1N3VaueA2jXJgxhWEMZyfaYrka2Ar0O+ce\nL3LNmBCRj6JWc79AZzJuQ2c4PgDsCLvGOXePiPwEuFFEFqPGF0kvnp875zqK3PYUETkXraS2AucC\nV6HC75JyqxQNoxyYoDKM4dyC/ry/jKrj9gLLJuhe24C3ouby89A+rfuBDxQRGO8DrkXHfP0dcBx4\nxEt7Ma70lgHvuqdQk/tvOOeOjOUhDGOisanoDcMwjJrG+qgMwzCMmsYElWEYhlHTmKAyDMMwahoT\nVIZhGEZNY4LKMAzDqGlMUBmGYRg1jQkqwzAMo6YxQWUYhmHUNCaoDMMwjJrm/wHycbfkpSGtYgAA\nAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f532db36350>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\nSznzzDPp1q0bqamp5OfnM27cOPx+f93zN23axC9/+Ut69+5NSkoK++yzD1OmTInU1xIzYY+jijcR\n6Q3cDrxXb+2rPKCoiebFoftcoDyc11eFrhlOj6proY2hMiZhVG9o3fYoOOSQQ/j73/9Ov379OP30\n09l7771bbH/BBRdwzjnncNVVV/Hpp59y++23U1FRwdSpU+varFmzhuuvv54+ffpQUVHBCy+8wIgR\nI/j8888ZNKhhPdi1117LiSeeyPPPP091dTUAJ598Mrm5uTz++ON06dKFNWvWMGvWrLoeXmlpKcOH\nD6eqqopbb72VwsJC3n77ba688kpqamq49tprI/slRVGz61GJSBA4TFU/jW1ITcaSCcwFegGHqOpP\noe1LgS9U9WeN2k8AngLyVfXHJl7vcuBygO7duw99+umn8dbkMKb0BNJTqviwx5sEXBnR/VAmIsrL\ny8nMbFXH2cRAdnY2eXkNh3gUfJwYZyqKjljZ6uf88MMPXHXVVSxZ4ixynpuby/Dhwxk7diwjRoyo\na/fqq68yadIkzj//fO6666667Y8++igPPfQQ7777Lv367fiHcCAQQFU54YQTGDlyJLfccgsACxYs\n4LzzzuOEE06oW3YenB7e0KFDmTJlCscff3yTMT/yyCP89a9/Zfbs2RQWbv/ub7rpJt555x0+/fRT\nkpOb76sUFxdTWlra7P6jjz46ZutRJXyPSkTScCr7+gEja5NUyFacXlNjefX270BVpwBTwFk4MTMz\nk+zcvUivqWJbVR5HHXNy5D6AiSpbODExNbno3sfxiaWxXVmssaCggEWLFvHRRx/xzjvvsGDBAt55\n5x3eeOMN7rjjDn73u98B0KVLFwB+8YtfNHifK6+8kgceeIC1a9dyzDHHAPDee+9x11138c0331Bc\nXFzXdu+99657blFREeAsbV//9fr27Uu/fv146KGHABg1ahT9+/dvEPMnn3zCYYcdxlFHHdVg+9ix\nY3n55ZeprKzkgAMOaPYzezweDjrooPC/pChqNlGpatzHWImIG3gVGAYcr6rfNmqyCDihiafuB6xW\n1bBO+wFsWV0EwOaqvuTsUrTGmBad3/DsTdgr/L7YwpjG82M3giYpKYkRI0bU9aDWrl3LmDFjuO22\n27j66qvJzd3+N3PtdaTGj9esWQPAF198wUknncTo0aN55pln6NmzJ0lJSUyYMKHu1F59PXs2XPJP\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f532b32ad50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f532b2c7750>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "mean_nll_s = nll_test_sparse.mean((0,1))\n",
    "std_nll_s  = nll_test_sparse.std((0,1))\n",
    "\n",
    "mean_time_s = run_time_sparse.mean((0,1))\n",
    "std_time_s  = run_time_sparse.std((0,1))\n",
    "\n",
    "mean_acc_s = acc_test_sparse.mean((0,1))*100\n",
    "std_acc_s  = acc_test_sparse.std((0,1))*100\n",
    "\n",
    "\n",
    "mean_time_d = run_time_dense.mean((0,1))\n",
    "std_time_d  = run_time_dense.std((0,1))\n",
    "\n",
    "mean_acc_d = acc_test_dense.mean((0,1))*100\n",
    "std_acc_d  = acc_test_dense.std((0,1))*100\n",
    "\n",
    "mean_nll_d = nll_test_dense.mean((0,1))\n",
    "std_nll_d  = nll_test_dense.std((0,1))\n",
    "\n",
    "\n",
    "\n",
    "font = {'family' : 'normal',\n",
    "        'weight' : 'normal',\n",
    "        'size'   : 16}\n",
    "matplotlib.rc('font', **font)\n",
    "\n",
    "nn = len(dim)\n",
    "\n",
    "stride = max( int(nn / 10), 1)\n",
    "stride2 = max( int(nn / 5), 1)\n",
    "\n",
    "# 1) Running to finish the experiment\n",
    "fig = plt.figure(figsize=(6,4))\n",
    "plot(dim, mean_time_d,  'o-', lw=2, label='Dense', color='blue', markevery=stride)\n",
    "fill_between(dim, mean_time_d+std_time_d, mean_time_d-std_time_d, facecolor='blue', alpha=0.3)\n",
    "plot(dim, mean_time_s,  's-', lw=2, label='Sparse', color='orange', markevery=stride)\n",
    "fill_between(dim, mean_time_s+std_time_s, mean_time_s-std_time_s, facecolor='orange', alpha=0.3)\n",
    "plt.xlabel('Intrinsic Dim')\n",
    "plt.ylabel('Run Time (second)')\n",
    "# ax.set_title('width %d, depth %d' %(width[i], depth[j]))\n",
    "plt.grid()\n",
    "legend(loc='best', fancybox=True, framealpha=0.5)\n",
    "plt.xlim([-20,1500])\n",
    "# plt.ylim([-0.1,1.1])\n",
    "fig.savefig(\"fnn_mnist_time_sparse_dense.pdf\", bbox_inches='tight')        \n",
    "plt.show()\n",
    "\n",
    "\n",
    "\n",
    "# 2) Testing Accuracy: Acc \n",
    "fig = plt.figure(figsize=(6,4))\n",
    "\n",
    "plot(dim, mean_acc_d[0]*np.ones(nn), 'o-',lw=2, label='Dense', color='blue', markevery=stride)\n",
    "fill_between(dim, (mean_acc_d[0]+std_acc_d[0])*np.ones(nn), (mean_acc_d[0]-std_acc_d[0])*np.ones(nn), facecolor='blue', alpha=0.1)\n",
    "plot(dim[1:], mean_acc_d[1:], 'o-', lw=2, color='blue', markevery=stride)\n",
    "fill_between(dim[1:], mean_acc_d[1:]+std_acc_d[1:], mean_acc_d[1:]-std_acc_d[1:], facecolor='blue', alpha=0.1)\n",
    "\n",
    "plot(dim, mean_acc_s[0]*np.ones(nn),'s-', lw=2,label='Sparse', color='orange', markevery=stride2)\n",
    "fill_between(dim, (mean_acc_s[0]+std_acc_s[0])*np.ones(nn), (mean_acc_s[0]-std_acc_s[0])*np.ones(nn), facecolor='orange', alpha=0.1)\n",
    "plot(dim[1:], mean_acc_s[1:], 's-', lw=2, color='orange', markevery=stride2)\n",
    "fill_between(dim[1:], mean_acc_s[1:]+std_acc_s[1:], mean_acc_s[1:]-std_acc_s[1:], facecolor='orange', alpha=0.1)\n",
    "\n",
    "plt.xlabel('Intrinsic Dim')\n",
    "plt.ylabel('Testing Accuracy (%)')\n",
    "# ax.set_title('width %d, depth %d' %(width[i], depth[j]))\n",
    "plt.grid()\n",
    "legend(loc='best', fancybox=True, framealpha=0.5)\n",
    "plt.xlim([-5,1500])\n",
    "plt.ylim([10,100])\n",
    "fig.savefig(\"fnn_mnist_acc_sparse_dense.pdf\", bbox_inches='tight')        \n",
    "plt.show()\n",
    "\n",
    "\n",
    "# 3) Testing Loss: NLL \n",
    "fig = plt.figure(figsize=(6,4))\n",
    "plot(dim, mean_nll_d[0]*np.ones(nn), 'o-',lw=2, label='Dense', color='blue', markevery=stride)\n",
    "fill_between(dim, (mean_nll_d[0]+std_nll_d[0])*np.ones(nn), (mean_nll_d[0]-std_nll_d[0])*np.ones(nn), facecolor='blue', alpha=0.1)\n",
    "plot(dim[1:], mean_nll_d[1:], 'o-', lw=2, color='blue', markevery=stride)\n",
    "fill_between(dim[1:], mean_nll_d[1:]+std_nll_d[1:], mean_nll_d[1:]-std_nll_d[1:], facecolor='blue', alpha=0.1)\n",
    "\n",
    "plot(dim, mean_nll_s[0]*np.ones(nn),'s-', lw=2,label='Sparse', color='orange', markevery=stride2)\n",
    "fill_between(dim, (mean_nll_s[0]+std_nll_s[0])*np.ones(nn), (mean_nll_s[0]-std_nll_s[0])*np.ones(nn), facecolor='orange', alpha=0.1)\n",
    "plot(dim[1:], mean_nll_s[1:], 's-', lw=2, color='orange', markevery=stride2)\n",
    "fill_between(dim[1:], mean_nll_s[1:]+std_nll_s[1:], mean_nll_s[1:]-std_nll_s[1:], facecolor='orange', alpha=0.1)\n",
    "\n",
    "plt.xlabel('Intrinsic Dim')\n",
    "plt.ylabel('Testing NLL')\n",
    "# ax.set_title('width %d, depth %d' %(width[i], depth[j]))\n",
    "plt.grid()\n",
    "legend(loc='best', fancybox=True, framealpha=0.5)\n",
    "plt.xlim([0,1500])\n",
    "plt.ylim([0.0,2.3])\n",
    "fig.savefig(\"fnn_mnist_nll_sparse_dense.pdf\", bbox_inches='tight')        \n",
    "plt.show()\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 179.564  611.431  205.606  199.965  219.243]\n",
      " [ 333.152  206.894  190.112  239.077  203.656]\n",
      " [ 238.67   205.017  360.31   521.668  246.512]]\n",
      "[[ 100.478   108.957   106.248   112.534   113.493 ]\n",
      " [  93.8947   96.3711  109.9     113.502   120.818 ]\n",
      " [ 101.307   108.224   118.039   118.069   121.025 ]]\n"
     ]
    }
   ],
   "source": [
    "print run_time_dense[:,:,0]\n",
    "print run_time_sparse[:,:,0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 21.58527578   3.20531683   2.49994044   2.45833223   1.10384097\n",
      "   0.50835421   0.50190127   0.70524196   0.58372596   0.51385947\n",
      "   0.40416938   0.30025471   0.51759959   0.36329725   0.49204968\n",
      "   0.47547684   0.44360944   0.36021969   0.33203347   0.44045734\n",
      "   0.51420964   0.35804407   0.32605657   0.40974247   0.40321706\n",
      "   0.37767476   0.39395093   0.28205594   0.344186     0.30929741]\n",
      "[ 21.56515616   2.52041478   2.97534939   1.56217029   0.81700972\n",
      "   0.79665021   0.64138253   0.41243774   0.41398873   0.44825588\n",
      "   0.47275364   0.51625403   0.37199761   0.45251593   0.43100915\n",
      "   0.4416283    0.36108725   0.36272794   0.36700954   0.48034247\n",
      "   0.51051869   0.40722148   0.38257839   0.29954336   0.3229957\n",
      "   0.36373617   0.45871511   0.35387003   0.38521798   0.312299  ]\n"
     ]
    }
   ],
   "source": [
    "print std_acc_s\n",
    "print std_acc_d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
